Browse Source

Thread save draw/resetscreen/init_screen for celery monitor

German M. Bravo 12 years ago
parent
commit
efbf47a7be
1 changed files with 7 additions and 0 deletions
  1. 7 0
      celery/events/cursesmon.py

+ 7 - 0
celery/events/cursesmon.py

@@ -68,6 +68,7 @@ class CursesMonitor(object):  # pragma: no cover
                           'I': self.selection_info,
                           'L': self.selection_rate_limit}
         self.keymap = dict(default_keymap, **self.keymap)
+        self.lock = threading.RLock()
 
     def format_row(self, uuid, task, worker, timestamp, state):
         mx = self.display_width
@@ -346,6 +347,7 @@ class CursesMonitor(object):  # pragma: no cover
                             task.state, state_color | attr)
 
     def draw(self):
+        self.lock.acquire()
         win = self.win
         self.handle_keypress()
         x = LEFT_BORDER_OFFSET
@@ -430,6 +432,7 @@ class CursesMonitor(object):  # pragma: no cover
         self.safe_add_str(my - 2, x + len(self.help_title), self.help,
                           curses.A_DIM)
         win.refresh()
+        self.lock.release()
 
     def safe_add_str(self, y, x, string, *args, **kwargs):
         if x + len(string) > self.screen_width:
@@ -437,6 +440,7 @@ class CursesMonitor(object):  # pragma: no cover
         self.win.addstr(y, x, string, *args, **kwargs)
 
     def init_screen(self):
+        self.lock.acquire()
         self.win = curses.initscr()
         self.win.nodelay(True)
         self.win.keypad(True)
@@ -460,12 +464,15 @@ class CursesMonitor(object):  # pragma: no cover
             self.state_colors[state] = curses.color_pair(2)
 
         curses.cbreak()
+        self.lock.release()
 
     def resetscreen(self):
+        self.lock.acquire()
         curses.nocbreak()
         self.win.keypad(False)
         curses.echo()
         curses.endwin()
+        self.lock.release()
 
     def nap(self):
         curses.napms(self.screen_delay)