home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.6)
-
- from __future__ import with_statement
- import util.primitives.funcs as funcs
- import threading
- from Queue import Queue
- from functools import wraps
- from traceback import print_exc
- __all__ = [
- 'BackgroundThread',
- 'add_before_cb',
- 'add_before_cb']
-
- class DelegateThread(threading.Thread):
-
- def __init__(self, group = None, target = None, name = None, args = (), kwargs = None, verbose = None):
- threading.Thread.__init__(self, group, target, name, args, kwargs, verbose)
- self.BeforeRun = funcs.Delegate()
- self.AfterRun = funcs.Delegate()
-
-
-
- class BackgroundThread(DelegateThread):
-
- def __init__(self, group = None, target = None, name = None, args = (), kwargs = None, verbose = None):
- DelegateThread.__init__(self, group, target, name, args, kwargs, verbose)
- self.setDaemon(True)
- self.BeforeRun[:] = _before_run
- self.AfterRun[:] = _after_run
-
-
- _before_run = []
- _after_run = []
-
- def add_before_cb(cb):
- _before_run.append(cb)
-
-
- def add_after_cb(cb):
- _after_run.append(cb)
-
- from thread import get_ident
-
- class on_thread(object):
- threads = { }
- lock = threading.RLock()
-
- def __init__(self, name, daemon = True):
- self.name = name
- self.daemon = daemon
-
- try:
- self._id = self.threads[self.name].ident
- except KeyError:
- self._id = -1
-
-
-
- def thread(self):
-
- try:
- return self._thread
- except AttributeError:
- self.lock.__enter__()
-
- try:
- self._thread = self.threads[self.name]
- except KeyError:
- self.lock.__exit__
- self.lock.__exit__
- self.lock
- self._thread = self.threads[self.name] = on_thread_thread(self.name, daemon = self.daemon)
- self._thread.start()
- self._id = self._thread.ident
- except:
- self.lock.__exit__
- finally:
- pass
-
- return self._thread
- self.lock.__exit__
-
-
- thread = property(thread)
-
- def _done(self, thread_name):
- self.lock.__enter__()
-
- try:
- self.threads.pop(thread_name)
- finally:
- pass
-
-
-
- def now(self):
- return self._id == get_ident()
-
- now = property(now)
-
- def call(self, func, *a, **k):
- self.thread.queue(func, *a, **k)
-
-
- def __call__(self, func):
-
- def wrapper(*a, **k):
- self.call(func, *a, **k)
-
- wrapper = (None, wraps(func))(wrapper)
- wrapper.on_thread = self
- return wrapper
-
-
-
- try:
- from wx import SEHGuard
- except ImportError:
-
- SEHGuard = lambda c: c()
-
-
- class on_thread_thread(BackgroundThread):
-
- def __init__(self, name, daemon = True):
- BackgroundThread.__init__(self, name = name)
- self.setDaemon(daemon)
- self.work = Queue()
- self.done = False
-
-
- def run(self):
- self.BeforeRun()
-
- try:
- SEHGuard(self._consumer_loop)
- finally:
- self.AfterRun()
-
-
-
- def _consumer_loop(self):
- while not self.done:
- setattr(self, 'loopcount', getattr(self, 'loopcount', 0) + 1)
- (func, args, kwargs) = self.work.get()
-
- try:
- func(*args, **kwargs)
- except Exception:
- print_exc()
-
- self.work.task_done()
- on_thread(self.name)._done()
-
-
- def queue(self, func, *a, **k):
- self.work.put((func, a, k))
-
-
- def join(self):
- self.done = True
- self.work.join()
-
-
-