]> 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 threading import *
 from StringIO import StringIO
+from Queue import Queue
 import sys, traceback, thread
 from offlineimap.ui import UIBase       # for getglobalui()
 
 import sys, traceback, thread
 from offlineimap.ui import UIBase       # for getglobalui()
 
@@ -88,8 +89,7 @@ class threadlist:
 # Exit-notify threads
 ######################################################################
 
 # Exit-notify threads
 ######################################################################
 
-exitcondition = Condition(Lock())
-exitthreads = []
+exitthreads = Queue(5)
 inited = 0
 
 def initexitnotify():
 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.
     """
     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.
     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."""
 
 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):
     """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
         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)
             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
 
     def setExitCause(self, cause):
         self.exitcause = cause