]> code.delx.au - offlineimap/commitdiff
Rework threadutil to use Queue for simplification and power-friendliness
authorJohn Goerzen <jgoerzen@complete.org>
Sat, 2 Aug 2008 20:10:11 +0000 (15:10 -0500)
committerJohn Goerzen <jgoerzen@complete.org>
Sat, 2 Aug 2008 20:10:11 +0000 (15:10 -0500)
Removes code and should avoid weird Python situation that causes cpu
wakeups

fixes deb#434074
fixes #66

offlineimap/threadutil.py

index 665d33413cb754c7b0dde100138c615b3d14424e..5f537086370b24fcf2aa512c98f849b4dd9a574a 100644 (file)
@@ -18,6 +18,7 @@
 
 from threading import *
 from StringIO import StringIO
+from Queue import Queue
 import sys, traceback, thread
 from offlineimap.ui import UIBase       # for getglobalui()
 
@@ -88,8 +89,7 @@ class threadlist:
 # Exit-notify threads
 ######################################################################
 
-exitcondition = Condition(Lock())
-exitthreads = []
+exitthreads = Queue(5)
 inited = 0
 
 def initexitnotify():
@@ -110,17 +110,10 @@ def exitnotifymonitorloop(callback):
     an ExitNotifyThread, or else an infinite loop may result.  Furthermore,
     the monitor will hold the lock all the while the other thread is waiting.
     """
-    global exitcondition, exitthreads
+    global exitthreads
     while 1:                            # Loop forever.
-        exitcondition.acquire()
-        try:
-            while not len(exitthreads):
-                exitcondition.wait(1)
-
-            while len(exitthreads):
-                callback(exitthreads.pop(0)) # Pull off in order added!
-        finally:
-            exitcondition.release()
+        callback(exitthreads.get(True))
+        exitthreads.task_done()
 
 def threadexited(thread):
     """Called when a thread exits."""
@@ -146,7 +139,7 @@ class ExitNotifyThread(Thread):
     """This class is designed to alert a "monitor" to the fact that a thread has
     exited and to provide for the ability for it to find out why."""
     def run(self):
-        global exitcondition, exitthreads, profiledir
+        global exitthreads, profiledir
         self.threadid = thread.get_ident()
         try:
             if not profiledir:          # normal case
@@ -171,10 +164,8 @@ class ExitNotifyThread(Thread):
             self.setExitCause('NORMAL')
         if not hasattr(self, 'exitmessage'):
             self.setExitMessage(None)
-        exitcondition.acquire()
-        exitthreads.append(self)
-        exitcondition.notify()
-        exitcondition.release()
+
+        exitthreads.put(self, True)
 
     def setExitCause(self, cause):
         self.exitcause = cause