Rework threadutil to use Queue for simplification and power-friendliness
Removes code and should avoid weird Python situation that causes cpu wakeups fixes deb#434074 fixes #66
This commit is contained in:
parent
2b23657db0
commit
8114877fae
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user