[tor-commits] [nyx/master] Drop torrc panel lock
atagar at torproject.org
atagar at torproject.org
Sun Feb 14 02:55:49 UTC 2016
commit 0b4715ca0702a75b76d0b18e01ce9fc0c88e015a
Author: Damian Johnson <atagar at torproject.org>
Date: Mon Jan 18 09:21:12 2016 -0800
Drop torrc panel lock
Might not be safe yet but as with the other panels, I'll be making this thread
safe.
---
nyx/menu/actions.py | 1 -
nyx/torrc_panel.py | 284 ++++++++++++++++++++++++++--------------------------
2 files changed, 140 insertions(+), 145 deletions(-)
diff --git a/nyx/menu/actions.py b/nyx/menu/actions.py
index 32313b4..b6a4ae3 100644
--- a/nyx/menu/actions.py
+++ b/nyx/menu/actions.py
@@ -290,7 +290,6 @@ def make_torrc_menu(torrc_panel):
"""
torrc_menu = nyx.menu.item.Submenu('Torrc')
- torrc_menu.add(nyx.menu.item.MenuItem('Reload', torrc_panel.reload_torrc))
if torrc_panel.strip_comments:
label, arg = 'Show', True
diff --git a/nyx/torrc_panel.py b/nyx/torrc_panel.py
index 4248ae0..01d12fc 100644
--- a/nyx/torrc_panel.py
+++ b/nyx/torrc_panel.py
@@ -4,7 +4,6 @@ Panel displaying the torrc or nyxrc with the validation done against it.
import math
import curses
-import threading
from nyx.util import expand_path, panel, tor_config, tor_controller, ui_tools
@@ -23,7 +22,6 @@ class TorrcPanel(panel.Panel):
def __init__(self, stdscr):
panel.Panel.__init__(self, stdscr, 'torrc', 0)
- self._vals_lock = threading.RLock()
self.scroll = 0
self.show_line_num = True # shows left aligned line numbers
self.strip_comments = False # drops comments and extra whitespace
@@ -85,22 +83,21 @@ class TorrcPanel(panel.Panel):
self.redraw(True)
def handle_key(self, key):
- with self._vals_lock:
- if key.is_scroll():
- page_height = self.get_preferred_size()[0] - 1
- new_scroll = ui_tools.get_scroll_position(key, self.scroll, page_height, self._last_content_height)
-
- if self.scroll != new_scroll:
- self.scroll = new_scroll
- self.redraw(True)
- elif key.match('n'):
- self.set_line_number_visible(not self.show_line_num)
- elif key.match('s'):
- self.set_comments_visible(self.strip_comments)
- else:
- return False
-
- return True
+ if key.is_scroll():
+ page_height = self.get_preferred_size()[0] - 1
+ new_scroll = ui_tools.get_scroll_position(key, self.scroll, page_height, self._last_content_height)
+
+ if self.scroll != new_scroll:
+ self.scroll = new_scroll
+ self.redraw(True)
+ elif key.match('n'):
+ self.set_line_number_visible(not self.show_line_num)
+ elif key.match('s'):
+ self.set_comments_visible(self.strip_comments)
+ else:
+ return False
+
+ return True
def set_visible(self, is_visible):
if not is_visible:
@@ -120,180 +117,179 @@ class TorrcPanel(panel.Panel):
]
def draw(self, width, height):
- with self._vals_lock:
- # If true, we assume that the cached value in self._last_content_height is
- # still accurate, and stop drawing when there's nothing more to display.
- # Otherwise the self._last_content_height is suspect, and we'll process all
- # the content to check if it's right (and redraw again with the corrected
- # height if not).
+ # If true, we assume that the cached value in self._last_content_height is
+ # still accurate, and stop drawing when there's nothing more to display.
+ # Otherwise the self._last_content_height is suspect, and we'll process all
+ # the content to check if it's right (and redraw again with the corrected
+ # height if not).
- trust_last_content_height = self._last_content_height_args == (width, height)
+ trust_last_content_height = self._last_content_height_args == (width, height)
- # restricts scroll location to valid bounds
+ # restricts scroll location to valid bounds
- self.scroll = max(0, min(self.scroll, self._last_content_height - height + 1))
+ self.scroll = max(0, min(self.scroll, self._last_content_height - height + 1))
- if self.torrc_content is None:
- rendered_contents = ['### Unable to load the torrc ###']
- corrections = {}
- else:
- rendered_contents = [ui_tools.get_printable(line.replace('\t', ' ')) for line in self.torrc_content]
+ if self.torrc_content is None:
+ rendered_contents = ['### Unable to load the torrc ###']
+ corrections = {}
+ else:
+ rendered_contents = [ui_tools.get_printable(line.replace('\t', ' ')) for line in self.torrc_content]
- if self.strip_comments:
- for i in range(len(rendered_contents)):
- line = rendered_contents[i]
+ if self.strip_comments:
+ for i in range(len(rendered_contents)):
+ line = rendered_contents[i]
- if line and '#' in line:
- rendered_contents[i] = line[:line.find('#')].strip()
+ if line and '#' in line:
+ rendered_contents[i] = line[:line.find('#')].strip()
- corrections = dict((line_number, (issue, msg)) for line_number, issue, msg in tor_config.validate(self.torrc_content))
+ corrections = dict((line_number, (issue, msg)) for line_number, issue, msg in tor_config.validate(self.torrc_content))
- # offset to make room for the line numbers
+ # offset to make room for the line numbers
- line_number_offset = 0
+ line_number_offset = 0
- if self.show_line_num:
- if len(rendered_contents) == 0:
- line_number_offset = 2
- else:
- line_number_offset = int(math.log10(len(rendered_contents))) + 2
+ if self.show_line_num:
+ if len(rendered_contents) == 0:
+ line_number_offset = 2
+ else:
+ line_number_offset = int(math.log10(len(rendered_contents))) + 2
- # draws left-hand scroll bar if content's longer than the height
+ # draws left-hand scroll bar if content's longer than the height
- scroll_offset = 0
+ scroll_offset = 0
- if self._last_content_height > height - 1:
- scroll_offset = 3
- self.add_scroll_bar(self.scroll, self.scroll + height - 1, self._last_content_height, 1)
+ if self._last_content_height > height - 1:
+ scroll_offset = 3
+ self.add_scroll_bar(self.scroll, self.scroll + height - 1, self._last_content_height, 1)
- display_line = -self.scroll + 1 # line we're drawing on
+ display_line = -self.scroll + 1 # line we're drawing on
- # draws the top label
+ # draws the top label
- if self.is_title_visible():
- location_label = ' (%s)' % self.torrc_location
- self.addstr(0, 0, 'Tor Configuration File%s:' % (location_label), curses.A_STANDOUT)
+ if self.is_title_visible():
+ location_label = ' (%s)' % self.torrc_location
+ self.addstr(0, 0, 'Tor Configuration File%s:' % (location_label), curses.A_STANDOUT)
- is_multiline = False # true if we're in the middle of a multiline torrc entry
+ is_multiline = False # true if we're in the middle of a multiline torrc entry
- for line_number in range(0, len(rendered_contents)):
- line_text = rendered_contents[line_number]
- line_text = line_text.rstrip() # remove ending whitespace
+ for line_number in range(0, len(rendered_contents)):
+ line_text = rendered_contents[line_number]
+ line_text = line_text.rstrip() # remove ending whitespace
- # blank lines are hidden when stripping comments
+ # blank lines are hidden when stripping comments
- if self.strip_comments and not line_text:
- continue
+ if self.strip_comments and not line_text:
+ continue
- # splits the line into its component (msg, format) tuples
+ # splits the line into its component (msg, format) tuples
- line_comp = {
- 'option': ['', (curses.A_BOLD, 'green')],
- 'argument': ['', (curses.A_BOLD, 'cyan')],
- 'correction': ['', (curses.A_BOLD, 'cyan')],
- 'comment': ['', ('white',)],
- }
+ line_comp = {
+ 'option': ['', (curses.A_BOLD, 'green')],
+ 'argument': ['', (curses.A_BOLD, 'cyan')],
+ 'correction': ['', (curses.A_BOLD, 'cyan')],
+ 'comment': ['', ('white',)],
+ }
- # parses the comment
+ # parses the comment
- comment_index = line_text.find('#')
+ comment_index = line_text.find('#')
- if comment_index != -1:
- line_comp['comment'][0] = line_text[comment_index:]
- line_text = line_text[:comment_index]
+ if comment_index != -1:
+ line_comp['comment'][0] = line_text[comment_index:]
+ line_text = line_text[:comment_index]
- # splits the option and argument, preserving any whitespace around them
+ # splits the option and argument, preserving any whitespace around them
- stripped_line = line_text.strip()
- option_index = stripped_line.find(' ')
+ stripped_line = line_text.strip()
+ option_index = stripped_line.find(' ')
- if is_multiline:
- # part of a multiline entry started on a previous line so everything
- # is part of the argument
- line_comp['argument'][0] = line_text
- elif option_index == -1:
- # no argument provided
- line_comp['option'][0] = line_text
- else:
- option_text = stripped_line[:option_index]
- option_end = line_text.find(option_text) + len(option_text)
- line_comp['option'][0] = line_text[:option_end]
- line_comp['argument'][0] = line_text[option_end:]
+ if is_multiline:
+ # part of a multiline entry started on a previous line so everything
+ # is part of the argument
+ line_comp['argument'][0] = line_text
+ elif option_index == -1:
+ # no argument provided
+ line_comp['option'][0] = line_text
+ else:
+ option_text = stripped_line[:option_index]
+ option_end = line_text.find(option_text) + len(option_text)
+ line_comp['option'][0] = line_text[:option_end]
+ line_comp['argument'][0] = line_text[option_end:]
- # flags following lines as belonging to this multiline entry if it ends
- # with a slash
+ # flags following lines as belonging to this multiline entry if it ends
+ # with a slash
- if stripped_line:
- is_multiline = stripped_line.endswith('\\')
+ if stripped_line:
+ is_multiline = stripped_line.endswith('\\')
- # gets the correction
+ # gets the correction
- if line_number in corrections:
- line_issue, line_issue_msg = corrections[line_number]
+ if line_number in corrections:
+ line_issue, line_issue_msg = corrections[line_number]
- if line_issue in (tor_config.ValidationError.DUPLICATE, tor_config.ValidationError.IS_DEFAULT):
- line_comp['option'][1] = (curses.A_BOLD, 'blue')
- line_comp['argument'][1] = (curses.A_BOLD, 'blue')
- elif line_issue == tor_config.ValidationError.MISMATCH:
- line_comp['argument'][1] = (curses.A_BOLD, 'red')
- line_comp['correction'][0] = ' (%s)' % line_issue_msg
- else:
- # For some types of configs the correction field is simply used to
- # provide extra data (for instance, the type for tor state fields).
+ if line_issue in (tor_config.ValidationError.DUPLICATE, tor_config.ValidationError.IS_DEFAULT):
+ line_comp['option'][1] = (curses.A_BOLD, 'blue')
+ line_comp['argument'][1] = (curses.A_BOLD, 'blue')
+ elif line_issue == tor_config.ValidationError.MISMATCH:
+ line_comp['argument'][1] = (curses.A_BOLD, 'red')
+ line_comp['correction'][0] = ' (%s)' % line_issue_msg
+ else:
+ # For some types of configs the correction field is simply used to
+ # provide extra data (for instance, the type for tor state fields).
- line_comp['correction'][0] = ' (%s)' % line_issue_msg
- line_comp['correction'][1] = (curses.A_BOLD, 'magenta')
+ line_comp['correction'][0] = ' (%s)' % line_issue_msg
+ line_comp['correction'][1] = (curses.A_BOLD, 'magenta')
- # draws the line number
+ # draws the line number
- if self.show_line_num and display_line < height and display_line >= 1:
- line_number_str = ('%%%ii' % (line_number_offset - 1)) % (line_number + 1)
- self.addstr(display_line, scroll_offset, line_number_str, curses.A_BOLD, 'yellow')
+ if self.show_line_num and display_line < height and display_line >= 1:
+ line_number_str = ('%%%ii' % (line_number_offset - 1)) % (line_number + 1)
+ self.addstr(display_line, scroll_offset, line_number_str, curses.A_BOLD, 'yellow')
- # draws the rest of the components with line wrap
+ # draws the rest of the components with line wrap
- cursor_location, line_offset = line_number_offset + scroll_offset, 0
- display_queue = [line_comp[entry] for entry in ('option', 'argument', 'correction', 'comment')]
+ cursor_location, line_offset = line_number_offset + scroll_offset, 0
+ display_queue = [line_comp[entry] for entry in ('option', 'argument', 'correction', 'comment')]
- while display_queue:
- msg, format = display_queue.pop(0)
+ while display_queue:
+ msg, format = display_queue.pop(0)
- max_msg_size, include_break = width - cursor_location, False
+ max_msg_size, include_break = width - cursor_location, False
- if len(msg) >= max_msg_size:
- # message is too long - break it up
+ if len(msg) >= max_msg_size:
+ # message is too long - break it up
- if line_offset == MAX_WRAP_PER_LINE - 1:
- msg = str_tools.crop(msg, max_msg_size)
- else:
- include_break = True
- msg, remainder = str_tools.crop(msg, max_msg_size, 4, 4, str_tools.Ending.HYPHEN, True)
- display_queue.insert(0, (remainder.strip(), format))
+ if line_offset == MAX_WRAP_PER_LINE - 1:
+ msg = str_tools.crop(msg, max_msg_size)
+ else:
+ include_break = True
+ msg, remainder = str_tools.crop(msg, max_msg_size, 4, 4, str_tools.Ending.HYPHEN, True)
+ display_queue.insert(0, (remainder.strip(), format))
- draw_line = display_line + line_offset
+ draw_line = display_line + line_offset
- if msg and draw_line < height and draw_line >= 1:
- self.addstr(draw_line, cursor_location, msg, *format)
+ if msg and draw_line < height and draw_line >= 1:
+ self.addstr(draw_line, cursor_location, msg, *format)
- # If we're done, and have added content to this line, then start
- # further content on the next line.
+ # If we're done, and have added content to this line, then start
+ # further content on the next line.
- cursor_location += len(msg)
- include_break |= not display_queue and cursor_location != line_number_offset + scroll_offset
+ cursor_location += len(msg)
+ include_break |= not display_queue and cursor_location != line_number_offset + scroll_offset
- if include_break:
- line_offset += 1
- cursor_location = line_number_offset + scroll_offset
+ if include_break:
+ line_offset += 1
+ cursor_location = line_number_offset + scroll_offset
- display_line += max(line_offset, 1)
+ display_line += max(line_offset, 1)
- if trust_last_content_height and display_line >= height:
- break
+ if trust_last_content_height and display_line >= height:
+ break
- if not trust_last_content_height:
- self._last_content_height_args = (width, height)
- new_content_height = display_line + self.scroll - 1
+ if not trust_last_content_height:
+ self._last_content_height_args = (width, height)
+ new_content_height = display_line + self.scroll - 1
- if self._last_content_height != new_content_height:
- self._last_content_height = new_content_height
- self.redraw(True)
+ if self._last_content_height != new_content_height:
+ self._last_content_height = new_content_height
+ self.redraw(True)
More information about the tor-commits
mailing list