home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_647 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  10.6 KB  |  380 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __all__ = [
  5.     'Queue',
  6.     'SimpleQueue',
  7.     'JoinableQueue']
  8. import sys
  9. import os
  10. import threading
  11. import collections
  12. import time
  13. import atexit
  14. import weakref
  15. from Queue import Empty, Full
  16. import _multiprocessing
  17. from multiprocessing import Pipe
  18. from multiprocessing.synchronize import Lock, BoundedSemaphore, Semaphore, Condition
  19. from multiprocessing.util import debug, info, Finalize, register_after_fork
  20. from multiprocessing.forking import assert_spawning
  21.  
  22. class Queue(object):
  23.     
  24.     def __init__(self, maxsize = 0):
  25.         if maxsize <= 0:
  26.             maxsize = _multiprocessing.SemLock.SEM_VALUE_MAX
  27.         
  28.         self._maxsize = maxsize
  29.         (self._reader, self._writer) = Pipe(duplex = False)
  30.         self._rlock = Lock()
  31.         self._opid = os.getpid()
  32.         if sys.platform == 'win32':
  33.             self._wlock = None
  34.         else:
  35.             self._wlock = Lock()
  36.         self._sem = BoundedSemaphore(maxsize)
  37.         self._after_fork()
  38.         if sys.platform != 'win32':
  39.             register_after_fork(self, Queue._after_fork)
  40.         
  41.  
  42.     
  43.     def __getstate__(self):
  44.         assert_spawning(self)
  45.         return (self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid)
  46.  
  47.     
  48.     def __setstate__(self, state):
  49.         (self._maxsize, self._reader, self._writer, self._rlock, self._wlock, self._sem, self._opid) = state
  50.         self._after_fork()
  51.  
  52.     
  53.     def _after_fork(self):
  54.         debug('Queue._after_fork()')
  55.         self._notempty = threading.Condition(threading.Lock())
  56.         self._buffer = collections.deque()
  57.         self._thread = None
  58.         self._jointhread = None
  59.         self._joincancelled = False
  60.         self._closed = False
  61.         self._close = None
  62.         self._send = self._writer.send
  63.         self._recv = self._reader.recv
  64.         self._poll = self._reader.poll
  65.  
  66.     
  67.     def put(self, obj, block = True, timeout = None):
  68.         if not self._sem.acquire(block, timeout):
  69.             raise Full
  70.         self._sem.acquire(block, timeout)
  71.         self._notempty.acquire()
  72.         
  73.         try:
  74.             if self._thread is None:
  75.                 self._start_thread()
  76.             
  77.             self._buffer.append(obj)
  78.             self._notempty.notify()
  79.         finally:
  80.             self._notempty.release()
  81.  
  82.  
  83.     
  84.     def get(self, block = True, timeout = None):
  85.         if block and timeout is None:
  86.             self._rlock.acquire()
  87.             
  88.             try:
  89.                 res = self._recv()
  90.                 self._sem.release()
  91.                 return res
  92.             finally:
  93.                 self._rlock.release()
  94.  
  95.         elif block:
  96.             deadline = time.time() + timeout
  97.         
  98.         if not self._rlock.acquire(block, timeout):
  99.             raise Empty
  100.         self._rlock.acquire(block, timeout)
  101.         
  102.         try:
  103.             if not block or deadline - time.time():
  104.                 pass
  105.             if not self._poll(0):
  106.                 raise Empty
  107.             self._poll(0)
  108.             res = self._recv()
  109.             self._sem.release()
  110.             return res
  111.         finally:
  112.             self._rlock.release()
  113.  
  114.  
  115.     
  116.     def qsize(self):
  117.         return self._maxsize - self._sem._semlock._get_value()
  118.  
  119.     
  120.     def empty(self):
  121.         return not self._poll()
  122.  
  123.     
  124.     def full(self):
  125.         return self._sem._semlock._is_zero()
  126.  
  127.     
  128.     def get_nowait(self):
  129.         return self.get(False)
  130.  
  131.     
  132.     def put_nowait(self, obj):
  133.         return self.put(obj, False)
  134.  
  135.     
  136.     def close(self):
  137.         self._closed = True
  138.         self._reader.close()
  139.         if self._close:
  140.             self._close()
  141.         
  142.  
  143.     
  144.     def join_thread(self):
  145.         debug('Queue.join_thread()')
  146.         if self._jointhread:
  147.             self._jointhread()
  148.         
  149.  
  150.     
  151.     def cancel_join_thread(self):
  152.         debug('Queue.cancel_join_thread()')
  153.         self._joincancelled = True
  154.         
  155.         try:
  156.             self._jointhread.cancel()
  157.         except AttributeError:
  158.             pass
  159.  
  160.  
  161.     
  162.     def _start_thread(self):
  163.         debug('Queue._start_thread()')
  164.         self._buffer.clear()
  165.         self._thread = threading.Thread(target = Queue._feed, args = (self._buffer, self._notempty, self._send, self._wlock, self._writer.close), name = 'QueueFeederThread')
  166.         self._thread.daemon = True
  167.         debug('doing self._thread.start()')
  168.         self._thread.start()
  169.         debug('... done self._thread.start()')
  170.         created_by_this_process = self._opid == os.getpid()
  171.         if not (self._joincancelled) and not created_by_this_process:
  172.             self._jointhread = Finalize(self._thread, Queue._finalize_join, [
  173.                 weakref.ref(self._thread)], exitpriority = -5)
  174.         
  175.         self._close = Finalize(self, Queue._finalize_close, [
  176.             self._buffer,
  177.             self._notempty], exitpriority = 10)
  178.  
  179.     
  180.     def _finalize_join(twr):
  181.         debug('joining queue thread')
  182.         thread = twr()
  183.         if thread is not None:
  184.             thread.join()
  185.             debug('... queue thread joined')
  186.         else:
  187.             debug('... queue thread already dead')
  188.  
  189.     _finalize_join = staticmethod(_finalize_join)
  190.     
  191.     def _finalize_close(buffer, notempty):
  192.         debug('telling queue thread to quit')
  193.         notempty.acquire()
  194.         
  195.         try:
  196.             buffer.append(_sentinel)
  197.             notempty.notify()
  198.         finally:
  199.             notempty.release()
  200.  
  201.  
  202.     _finalize_close = staticmethod(_finalize_close)
  203.     
  204.     def _feed(buffer, notempty, send, writelock, close):
  205.         debug('starting thread to feed data to pipe')
  206.         is_exiting = is_exiting
  207.         import util
  208.         nacquire = notempty.acquire
  209.         nrelease = notempty.release
  210.         nwait = notempty.wait
  211.         bpopleft = buffer.popleft
  212.         sentinel = _sentinel
  213.         if sys.platform != 'win32':
  214.             wacquire = writelock.acquire
  215.             wrelease = writelock.release
  216.         else:
  217.             wacquire = None
  218.         
  219.         try:
  220.             while None:
  221.                 
  222.                 try:
  223.                     if not buffer:
  224.                         nwait()
  225.                 finally:
  226.                     nrelease()
  227.  
  228.                 
  229.                 try:
  230.                     while None:
  231.                         obj = bpopleft()
  232.                         if obj is sentinel:
  233.                             debug('feeder thread got sentinel -- exiting')
  234.                             close()
  235.                             return None
  236.                         if wacquire is None:
  237.                             send(obj)
  238.                             continue
  239.                         wacquire()
  240.                         
  241.                         try:
  242.                             send(obj)
  243.                         finally:
  244.                             wrelease()
  245.  
  246.                     continue
  247.                     except IndexError:
  248.                         continue
  249.                     
  250.                 except Exception:
  251.                     e = None
  252.                     
  253.                     try:
  254.                         if is_exiting():
  255.                             info('error in queue thread: %s', e)
  256.                         else:
  257.                             import traceback
  258.                             traceback.print_exc()
  259.                     except Exception:
  260.                         pass
  261.                     except:
  262.                         None<EXCEPTION MATCH>Exception
  263.                     
  264.  
  265.                     None<EXCEPTION MATCH>Exception
  266.  
  267.                 return None
  268.  
  269.  
  270.     _feed = staticmethod(_feed)
  271.  
  272. _sentinel = object()
  273.  
  274. class JoinableQueue(Queue):
  275.     
  276.     def __init__(self, maxsize = 0):
  277.         Queue.__init__(self, maxsize)
  278.         self._unfinished_tasks = Semaphore(0)
  279.         self._cond = Condition()
  280.  
  281.     
  282.     def __getstate__(self):
  283.         return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks)
  284.  
  285.     
  286.     def __setstate__(self, state):
  287.         Queue.__setstate__(self, state[:-2])
  288.         (self._cond, self._unfinished_tasks) = state[-2:]
  289.  
  290.     
  291.     def put(self, obj, block = True, timeout = None):
  292.         if not self._sem.acquire(block, timeout):
  293.             raise Full
  294.         self._sem.acquire(block, timeout)
  295.         self._notempty.acquire()
  296.         self._cond.acquire()
  297.         
  298.         try:
  299.             if self._thread is None:
  300.                 self._start_thread()
  301.             
  302.             self._buffer.append(obj)
  303.             self._unfinished_tasks.release()
  304.             self._notempty.notify()
  305.         finally:
  306.             self._cond.release()
  307.             self._notempty.release()
  308.  
  309.  
  310.     
  311.     def task_done(self):
  312.         self._cond.acquire()
  313.         
  314.         try:
  315.             if not self._unfinished_tasks.acquire(False):
  316.                 raise ValueError('task_done() called too many times')
  317.             self._unfinished_tasks.acquire(False)
  318.             if self._unfinished_tasks._semlock._is_zero():
  319.                 self._cond.notify_all()
  320.         finally:
  321.             self._cond.release()
  322.  
  323.  
  324.     
  325.     def join(self):
  326.         self._cond.acquire()
  327.         
  328.         try:
  329.             if not self._unfinished_tasks._semlock._is_zero():
  330.                 self._cond.wait()
  331.         finally:
  332.             self._cond.release()
  333.  
  334.  
  335.  
  336.  
  337. class SimpleQueue(object):
  338.     
  339.     def __init__(self):
  340.         (self._reader, self._writer) = Pipe(duplex = False)
  341.         self._rlock = Lock()
  342.         if sys.platform == 'win32':
  343.             self._wlock = None
  344.         else:
  345.             self._wlock = Lock()
  346.         self._make_methods()
  347.  
  348.     
  349.     def empty(self):
  350.         return not self._reader.poll()
  351.  
  352.     
  353.     def __getstate__(self):
  354.         assert_spawning(self)
  355.         return (self._reader, self._writer, self._rlock, self._wlock)
  356.  
  357.     
  358.     def __setstate__(self, state):
  359.         (self._reader, self._writer, self._rlock, self._wlock) = state
  360.         self._make_methods()
  361.  
  362.     
  363.     def _make_methods(self):
  364.         recv = self._reader.recv
  365.         racquire = self._rlock.acquire
  366.         rrelease = self._rlock.release
  367.         
  368.         def get():
  369.             racquire()
  370.             
  371.             try:
  372.                 return recv()
  373.             finally:
  374.                 rrelease()
  375.  
  376.  
  377.         self.get = get
  378.  
  379.  
  380.