mς
­fIc           @   sͺ  d  Z  d k Z y d k Z Wn  e j
 o e i e =  n Xd k l Z l	 Z
 d k l Z d k l Z d d d d d	 d
 d d d d d d d d g Z e i Z e i Z e i Z e i Z [ e Z d e f d     YZ d a d a d   Z  d   Z! e Z" d   Z# d e f d     YZ$ d   Z% d e f d     YZ& d   Z' d e f d     YZ( d    Z) d! e( f d"     YZ* d#   Z+ d$ e f d%     YZ, d& a- d' d(  Z. e   Z/ h  Z0 h  Z1 d e f d)     YZ2 d*   Z3 d+ e2 f d,     YZ4 d- e2 f d.     YZ5 d/   Z6 d0 e2 f d1     YZ7 d2   Z8 d3   Z9 d4   Z: e5   y d5 k l; Z< Wn  e j
 o d6 k= l< Z< n Xd7   Z> e d8 j o e>   n d S(9   s;   Thread module emulating a subset of Java's threading model.N(   s   times   sleep(   s
   format_exc(   s   dequet   activeCountt	   Conditiont   currentThreadt	   enumeratet   Eventt   Lockt   RLockt	   Semaphoret   BoundedSemaphoret   Threadt   Timert
   setprofilet   settracet   localt   _Verbosec           B   s   t  Z d  d  Z d   Z RS(   Nc         C   s   d  S(   N(    (   t   selft   verbose(    (    t&   /mit/python/lib/python2.4/threading.pyt   __init__6   s    c         G   s   d  S(   N(    (   R   t   args(    (    R   t   _note8   s    (   t   __name__t
   __module__t   NoneR   R   (    (    (    R   R   5   s   c         C   s
   |  a d  S(   N(   t   funct   _profile_hook(   R   (    (    R   R   @   s     c         C   s
   |  a d  S(   N(   R   t   _trace_hook(   R   (    (    R   R   D   s     c          O   s   t  |  |   S(   N(   t   _RLockR   t   kwargs(   R   R   (    (    R   R   L   s    R   c           B   sM   t  Z d  d  Z d   Z d d  Z d   Z d   Z d   Z d   Z	 RS(	   Nc         C   s2   t  i |  |  t   |  _ d  |  _ d |  _ d  S(   Ni    (	   R   R   R   R   t   _allocate_lockt   _RLock__blockR   t   _RLock__ownert   _RLock__count(   R   R   (    (    R   R   Q   s    	c         C   s-   d |  i i |  i o |  i i   |  i f S(   Ns   <%s(%s, %d)>(   R   t	   __class__R   R   t   getNameR    (   R   (    (    R   t   __repr__W   s    i   c         C   sd   t    } |  i | j o |  i d |  _ d Sn |  i i |  } | o | |  _ d |  _ n | S(   Ni   (	   R   t   meR   R   R    R   t   acquiret   blockingt   rc(   R   R&   R$   R'   (    (    R   R%   ]   s    	 		 c         C   sB   t    } |  i d |  _ } | p d  |  _ |  i i   n d  S(   Ni   (	   R   R$   R   R    t   countR   R   R   t   release(   R   R$   R(   (    (    R   R)   o   s    	 	c         C   s/   | \ } } |  i i   | |  _ | |  _ d  S(   N(   R(   t   ownerR   R   R%   R    R   (   R   t   .2R(   R*   (    (    R   t   _acquire_restore~   s   	c         C   s;   |  i } d |  _ |  i } d  |  _ |  i i   | | f S(   Ni    (   R   R    R(   R   R*   R   R   R)   (   R   R(   R*   (    (    R   t   _release_save   s     				c         C   s   |  i t   j S(   N(   R   R   R   (   R   (    (    R   t	   _is_owned   s    (
   R   R   R   R   R#   R%   R)   R,   R-   R.   (    (    (    R   R   O   s   				
c          O   s   t  |  |   S(   N(   t
   _ConditionR   R   (   R   R   (    (    R   R      s    R/   c           B   s\   t  Z d  d  d  Z d   Z d   Z d   Z d   Z d  d  Z d d  Z	 d	   Z
 RS(
   Nc         C   sΚ   t  i |  |  | d  j o t   } n | |  _ | i |  _ | i	 |  _	 y | i
 |  _
 Wn t j
 o n Xy | i |  _ Wn t j
 o n Xy | i |  _ Wn t j
 o n Xg  |  _ d  S(   N(   R   R   R   R   t   lockR   R   t   _Condition__lockR%   R)   R-   t   AttributeErrorR,   R.   t   _Condition__waiters(   R   R0   R   (    (    R   R      s&    	c         C   s   d |  i t |  i  f S(   Ns   <Condition(%s, %d)>(   R   R1   t   lenR3   (   R   (    (    R   R#   ±   s    c         C   s   |  i i   d  S(   N(   R   R1   R)   (   R   (    (    R   R-   ΄   s    c         C   s   |  i i   d  S(   N(   R   R1   R%   (   R   t   x(    (    R   R,   ·   s    c         C   s0   |  i i d  o |  i i   t Sn t Sd  S(   Ni    (   R   R1   R%   R)   t   Falset   True(   R   (    (    R   R.   Ί   s    c         C   s  t    } | i   |  i i |  |  i   } zΠ | d  j o | i   n² t
   | } d } xf t o^ | i d  } | o Pn | t
   } | d j o Pn t | d | d  } t |  qc W| p. y |  i i |  Wqώ t j
 o qώ Xn Wd  |  i |  Xd  S(   Nf0.00050000000000000001i    i   f0.050000000000000003(   R   t   waiterR%   R   R3   t   appendR-   t   saved_statet   timeoutR   t   _timet   endtimet   delayR7   t   gotitt	   remainingt   mint   _sleept   removet
   ValueErrorR,   (   R   R;   R>   R?   R8   R:   R=   R@   (    (    R   t   waitΓ   s<     	

  	 i   c         C   s   |  i } | |  } | p d  Sn |  i d |  | | d j o d p d  x? | D]7 } | i   y | i |  WqS t j
 o qS XqS Wd  S(   Ns"   %s.notify(): notifying %d waiter%si   t   st    (	   R   R3   t   nt   waitersR   R8   R)   RC   RD   (   R   RH   R8   R3   RI   (    (    R   t   notifyμ   s     	
  
c         C   s   |  i t |  i   d  S(   N(   R   RJ   R4   R3   (   R   (    (    R   t	   notifyAllύ   s    (   R   R   R   R   R#   R-   R,   R.   RE   RJ   RK   (    (    (    R   R/      s   					)c          O   s   t  |  |   S(   N(   t
   _SemaphoreR   R   (   R   R   (    (    R   R     s    RL   c           B   s,   t  Z d d  d  Z d d  Z d   Z RS(   Ni   c         C   s/   t  i |  |  t t    |  _ | |  _ d  S(   N(	   R   R   R   R   R   R   t   _Semaphore__condt   valuet   _Semaphore__value(   R   RN   R   (    (    R   R     s     c         C   sk   t  } |  i i   xD |  i d j o | p Pn |  i i   q W|  i d |  _ t } |  i i	   | S(   Ni    i   (
   R6   R'   R   RM   R%   RO   R&   RE   R7   R)   (   R   R&   R'   (    (    R   R%     s       c         C   s;   |  i i   |  i d |  _ |  i i   |  i i   d  S(   Ni   (   R   RM   R%   RO   RJ   R)   (   R   (    (    R   R)   !  s
     (   R   R   R   R   R%   R)   (    (    (    R   RL     s   c          O   s   t  |  |   S(   N(   t   _BoundedSemaphoreR   R   (   R   R   (    (    R   R   +  s    RP   c           B   s&   t  Z d  Z d e d  Z d   Z RS(   s6   Semaphore that checks that # releases is <= # acquiresi   c         C   s    t  i |  | |  | |  _ d  S(   N(   RL   R   R   RN   R   t   _initial_value(   R   RN   R   (    (    R   R   0  s    c         C   s-   |  i |  i j o t d  n t i |   S(   Ns!   Semaphore released too many times(   R   RO   RQ   RD   RL   R)   (   R   (    (    R   R)   4  s    (   R   R   t   __doc__R   R   R)   (    (    (    R   RP   .  s    c          O   s   t  |  |   S(   N(   t   _EventR   R   (   R   R   (    (    R   R   :  s    RS   c           B   s;   t  Z d  d  Z d   Z d   Z d   Z d  d  Z RS(   Nc         C   s/   t  i |  |  t t    |  _ t |  _ d  S(   N(	   R   R   R   R   R   R   t   _Event__condR6   t   _Event__flag(   R   R   (    (    R   R   A  s    c         C   s   |  i S(   N(   R   RU   (   R   (    (    R   t   isSetF  s    c         C   s<   |  i i   z t |  _ |  i i   Wd  |  i i   Xd  S(   N(   R   RT   R%   R7   RU   RK   R)   (   R   (    (    R   t   setI  s    	 c         C   s/   |  i i   z t |  _ Wd  |  i i   Xd  S(   N(   R   RT   R%   R6   RU   R)   (   R   (    (    R   t   clearQ  s
     c         C   sD   |  i i   z" |  i p |  i i |  n Wd  |  i i   Xd  S(   N(   R   RT   R%   RU   RE   R;   R)   (   R   R;   (    (    R   RE   X  s    
 (   R   R   R   R   RV   RW   RX   RE   (    (    (    R   RS   =  s
   			i    s	   Thread-%dc         C   s   t  d a  |  t  S(   Ni   (   t   _countert   template(   RZ   (    (    R   t   _newnameb  s     
c           B   sͺ   t  Z e Z e i Z d  d  d  f  h  d  d  Z d   Z	 d   Z
 d   Z d   Z d   Z d   Z d   Z d  d	  Z d
   Z d   Z d   Z d   Z d   Z RS(   Nc         C   s   t  i |  |  | |  _ t | p t    |  _	 | |  _ | |  _ |  i   |  _ t |  _ t |  _ t t    |  _ t |  _ t i |  _ d  S(   N(   R   R   R   R   t   targett   _Thread__targett   strt   nameR[   t   _Thread__nameR   t   _Thread__argsR   t   _Thread__kwargst   _set_daemont   _Thread__daemonicR6   t   _Thread__startedt   _Thread__stoppedR   R   t   _Thread__blockR7   t   _Thread__initializedt   _syst   stderrt   _Thread__stderr(   R   t   groupR\   R_   R   R   R   (    (    R   R   x  s     						c         C   s   t    i   S(   N(   R   t   isDaemon(   R   (    (    R   Rc     s    c         C   s`   d } |  i o
 d } n |  i o
 d } n |  i o | d } n d |  i i |  i | f S(   Nt   initialt   startedt   stoppeds    daemons   <%s(%s, %s)>(   t   statusR   Re   Rf   Rd   R!   R   R`   (   R   Rq   (    (    R   R#     s     




c         C   sE   t  i   |  t |  <t  i   t |  i f   t |  _ t	 d  d  S(   Nf9.9999999999999995e-07(
   t   _active_limbo_lockR%   R   t   _limboR)   t   _start_new_threadt   _Thread__bootstrapR7   Re   RB   (   R   (    (    R   t   start  s       


	c         C   s(   |  i o |  i |  i |  i   n d  S(   N(   R   R]   Ra   Rb   (   R   (    (    R   t   run€  s    
c      
   C   s³  zt  |  _ t i   |  t t   <t |  =t i   t	 o! |  i
 d |   t i t	  n t o! |  i
 d |   t i t  n y |  i   Wnσ t j
 o nβ t o' t i i d |  i   t   f  q|  i   \ } } } z |  i d |  i   d IJ|  i d IJxD | o< |  i d | i i i | i | i i i f IJ| i } qW|  i d | | f IJWd  ~ ~ ~ Xn XWd  |  i    y |  i!   Wn n XXd  S(	   Ns(   %s.__bootstrap(): registering trace hooks*   %s.__bootstrap(): registering profile hooks   Exception in thread %s:
%s
s   Exception in thread s2    (most likely raised during interpreter shutdown):s"   Traceback (most recent call last):s     File "%s", line %s, in %ss   %s: %s("   R7   R   Re   Rr   R%   t   _activet
   _get_identRs   R)   R   R   Ri   R   R   R   Rw   t
   SystemExitRj   t   writeR"   t   _format_exct   _Thread__exc_infot   exc_typet	   exc_valuet   exc_tbRk   t   tb_framet   f_codet   co_filenamet	   tb_linenot   co_namet   tb_nextt   _Thread__stopt   _Thread__delete(   R   R   R~   R   (    (    R   t   __bootstrap¨  sN    	

  ' /  
c         C   s4   |  i i   t |  _ |  i i   |  i i   d  S(   N(   R   Rg   R%   R7   Rf   RK   R)   (   R   (    (    R   t   __stopι  s    	c         C   s[   t  i   z? y t t   =Wn* t j
 o d t i j o   qH n XWd t  i   Xd S(   sA   Remove current thread from the dict of currently running threads.t   dummy_threadingN(   Rr   R%   Rx   Ry   t   KeyErrorRi   t   modulesR)   (   R   (    (    R   t   __deleteο  s     
 c         C   s€   |  i i   z | d  j o# xn |  i p |  i i   q  WnO t   | } x> |  i p3 | t   } | d j o Pn |  i i |  qP WWd  |  i i
   Xd  S(   Ni    (   R   Rg   R%   R;   R   Rf   RE   R<   t   deadlineR>   R)   (   R   R;   R>   R   (    (    R   t   join  s,         
 
  c         C   s   |  i S(   N(   R   R`   (   R   (    (    R   R"   .  s     c         C   s   t  |  |  _ d  S(   N(   R^   R_   R   R`   (   R   R_   (    (    R   t   setName2  s     c         C   s   |  i o |  i S(   N(   R   Re   Rf   (   R   (    (    R   t   isAlive6  s     c         C   s   |  i S(   N(   R   Rd   (   R   (    (    R   Rm   :  s     c         C   s   | |  _ d  S(   N(   t   daemonicR   Rd   (   R   R   (    (    R   t	   setDaemon>  s      (   R   R   R6   Rh   Ri   t   exc_infoR}   R   R   Rc   R#   Rv   Rw   Ru   R   R   R   R"   R   R   Rm   R   (    (    (    R   R	   o  s    						A		"				c          O   s   t  |  |   S(   N(   t   _TimerR   R   (   R   R   (    (    R   R
   E  s    R   c           B   s/   t  Z d  Z g  h  d  Z d   Z d   Z RS(   s²   Call a function after a specified number of seconds:

    t = Timer(30.0, f, args=[], kwargs={})
    t.start()
    t.cancel() # stop the timer's action if it's still waiting
    c         C   sA   t  i |   | |  _ | |  _ | |  _ | |  _ t   |  _ d  S(   N(	   R	   R   R   t   intervalt   functionR   R   R   t   finished(   R   R   R   R   R   (    (    R   R   P  s    				c         C   s   |  i i   d S(   s(   Stop the timer if it hasn't finished yetN(   R   R   RW   (   R   (    (    R   t   cancelX  s     c         C   sN   |  i i |  i  |  i i   p |  i |  i |  i   n |  i i   d  S(   N(	   R   R   RE   R   RV   R   R   R   RW   (   R   (    (    R   Rw   \  s    (   R   R   RR   R   R   Rw   (    (    (    R   R   H  s    	t   _MainThreadc           B   s#   t  Z d   Z d   Z d   Z RS(   Nc         C   sZ   t  i |  d d t |  _ t i   |  t t   <t i	   d  k
 } | i |  i  d  S(   NR_   t
   MainThread(   R	   R   R   R7   Re   Rr   R%   Rx   Ry   R)   t   atexitt   registert   _MainThread__exitfunc(   R   R   (    (    R   R   g  s    	

	c         C   s   t  S(   N(   R6   (   R   (    (    R   Rc   p  s    c         C   sN   |  i   t   } | o n x | o | i   t   } q! W|  i   d  S(   N(   R   R   t   _pickSomeNonDaemonThreadt   tR   R   (   R   R‘   (    (    R   t
   __exitfuncs  s    
	 
 (   R   R   R   Rc   R   (    (    (    R   R   e  s   			c          C   s;   x4 t    D]) }  |  i   o |  i   o |  Sq
 q
 Wd  S(   N(   R   R‘   Rm   R   R   (   R‘   (    (    R   R      s
    
 t   _DummyThreadc           B   s&   t  Z d   Z d   Z d  d  Z RS(   Nc         C   sG   t  i |  d t d  t |  _ t i   |  t t	   <t i
   d  S(   NR_   s   Dummy-%d(   R	   R   R   R[   R7   Re   Rr   R%   Rx   Ry   R)   (   R   (    (    R   R     s
    	
c         C   s   t  S(   N(   R7   (   R   (    (    R   Rc     s    c         C   s   d  S(   N(    (   R   R;   (    (    R   R     s    (   R   R   R   Rc   R   R   (    (    (    R   R£     s   		c           C   s0   y t  t   SWn t j
 o t   Sn Xd  S(   N(   Rx   Ry   R   R£   (    (    (    R   R      s    c          C   s.   t  i   t t  t t  }  t  i   |  S(   N(   Rr   R%   R4   Rx   Rs   R(   R)   (   R(   (    (    R   R    §  s    

c          C   s.   t  i   t i   t i   }  t  i   |  S(   N(   Rr   R%   Rx   t   valuesRs   t   activeR)   (   R₯   (    (    R   R   ­  s    

(   s   _local(   s   localc          C   s  d t  f d     Y} d t f d     Y} d t f d     Y} d }	 d }
 d	 }  | |
  } g  } xE t
 |	  D]7 } | | |   } | i d
 | d  | i |  qs W| | |  |	  } x" | D] } | i   t d  qΘ W| i   x | D] } | i   qχ W| i   d  S(   Nt   BoundedQueuec           B   s#   t  Z d   Z d   Z d   Z RS(   Nc         C   sV   t  i |   t   |  _ t |  i  |  _ t |  i  |  _ | |  _ t	   |  _
 d  S(   N(   R   R   R   R   t   monR   R'   t   wct   limitt   dequet   queue(   R   R©   (    (    R   R   Ζ  s    	c         C   s   |  i i   x; t |  i  |  i j o! |  i d |  |  i i	   q W|  i i
 |  |  i d | t |  i   |  i i   |  i i   d  S(   Ns   put(%s): queue fulls    put(%s): appended, length now %d(   R   R§   R%   R4   R«   R©   R   t   itemR¨   RE   R9   R'   RJ   R)   (   R   R¬   (    (    R   t   putΞ  s     	c         C   s   |  i i   x) |  i p |  i d  |  i i   q W|  i i   } |  i d | t	 |  i   |  i
 i   |  i i   | S(   Ns   get(): queue emptys   get(): got %s, %d left(   R   R§   R%   R«   R   R'   RE   t   popleftR¬   R4   R¨   RJ   R)   (   R   R¬   (    (    R   t   getΩ  s     
(   R   R   R   R­   R―   (    (    (    R   R¦   Δ  s   		t   ProducerThreadc           B   s   t  Z d   Z d   Z RS(   Nc         C   s)   t  i |  d d | |  _ | |  _ d  S(   NR_   t   Producer(   R	   R   R   R«   t   quota(   R   R«   R²   (    (    R   R   ζ  s    	c         C   sj   d k  l  } d } xP | |  i j  o? | d } |  i i d |  i   | f  t |   d  q Wd  S(   N(   s   randomi    i   s   %s.%df1.0000000000000001e-05(   t   randomt   counterR   R²   R«   R­   R"   RB   (   R   R³   R΄   (    (    R   Rw   λ  s     
 (   R   R   R   Rw   (    (    (    R   R°   δ  s   	t   ConsumerThreadc           B   s   t  Z d   Z d   Z RS(   Nc         C   s)   t  i |  d d | |  _ | |  _ d  S(   NR_   t   Consumer(   R	   R   R   R«   R(   (   R   R«   R(   (    (    R   R   φ  s    	c         C   s@   x9 |  i d j o( |  i i   } | GH|  i d |  _ q Wd  S(   Ni    i   (   R   R(   R«   R―   R¬   (   R   R¬   (    (    R   Rw   ϋ  s
     (   R   R   R   Rw   (    (    (    R   R΅   τ  s   	i   i   i   s   Producer-%di   f9.9999999999999995e-07(   R   R¦   R	   R°   R΅   t   NPt   QLt   NIt   Qt   Pt   ranget   iR‘   R   R9   t   CRv   RB   R   (   RΉ   RΎ   R°   R½   R¦   R»   R΅   RΊ   R‘   R·   RΈ   (    (    R   t   _testΒ  s.       

 t   __main__(?   RR   t   sysRi   t   threadt   ImportErrorR   R   t   timeR<   t   sleepRB   t	   tracebackt
   format_excR|   t   collectionsRͺ   t   __all__t   start_new_threadRt   t   allocate_lockR   t	   get_identRy   t   errort   ThreadErrorR6   t   _VERBOSEt   objectR   R   R   R   R   R   R   R   R   R   R/   R   RL   R   RP   R   RS   RY   R[   Rr   Rx   Rs   R	   R
   R   R   R    R£   R   R    R   t   _localR   t   _threading_localRΏ   ()   RP   R   R|   R   R    RB   RΞ   Rt   R   RΙ   RS   R   R   RΏ   R   Rr   R   R   Rͺ   R£   R	   R/   R   Ry   R   R   R   R
   RL   R[   RΒ   R    Rs   R   Rx   R   Ri   R<   R   R   RΟ   (    (    R   t   ?   sn   	
0					 			D	k	'		$	Φ						R