
][\/                 @   s  d  d d d d d g Z  d d l Z d d l Z d d l Z d d l Z d d l m Z d	 d
 l m Z d	 d l m	 Z	 d	 d l m
 Z
 y d d l m Z m Z Wn* e k
 r e d d d d   Yn Xe e d   \ Z Z e j j Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d    d  e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e j  Z d S)LockRLock	SemaphoreBoundedSemaphore	ConditionEvent    N)time   )context)process)util)SemLock
sem_unlinkz*This platform lacks a functioning sem_openz( implementation, therefore, the requiredz+ synchronization primitives needed will notz function, see issue 3770.   c               @   s   e  Z d  Z e j   Z d d   Z e d d    Z d d   Z	 d d   Z
 d	 d
   Z d d   Z d d   Z e d d    Z d S)r   c            C   sT  | d  k r t  j j   } n  | j   } t j d k pB | d k } xb t d  D]H } y, t j | | | |  j	   |  } |  _
 Wn t k
 r YqR XPqR Wt d   t j d | j  |  j   t j d k r d d   }	 t j |  |	  n  |  j
 j d  k	 rPd d	 l m }
 |
 |  j
 j  t j |  t j |  j
 j f d
 d n  d  S)Nwin32forkd   zcannot find name for semaphorezcreated semlock with handle %sc             S   s   |  j  j   d  S)N)_semlock_after_fork)obj r   1/usr/lib/python3.4/multiprocessing/synchronize.pyr   H   s    z%SemLock.__init__.<locals>._after_forkr	   )registerZexitpriorityr   )r
   Z_default_contextZget_contextZget_start_methodsysplatformrange_multiprocessingr   
_make_namer   FileExistsErrorr   debughandle_make_methodsZregister_after_forknamesemaphore_trackerr   ZFinalize_cleanup)selfkindvaluemaxvaluectxr"   Z
unlink_nowislr   r   r   r   r   __init__3   s.    
zSemLock.__init__c             C   s(   d d l  m } t |   | |   d  S)Nr	   )
unregister)r#   r-   r   )r"   r-   r   r   r   r$   U   s    
zSemLock._cleanupc             C   s"   |  j  j |  _ |  j  j |  _ d  S)N)r   acquirerelease)r%   r   r   r   r!   [   s    zSemLock._make_methodsc             C   s   |  j  j   S)N)r   	__enter__)r%   r   r   r   r0   _   s    zSemLock.__enter__c             G   s   |  j  j |   S)N)r   __exit__)r%   argsr   r   r   r1   b   s    zSemLock.__exit__c             C   sb   t  j |   |  j } t j d k r@ t  j   j | j  } n	 | j } | | j | j	 | j
 f S)Nr   )r
   assert_spawningr   r   r   Zget_spawning_popenZduplicate_for_childr    r&   r(   r"   )r%   r+   hr   r   r   __getstate__e   s    		zSemLock.__getstate__c             C   s8   t  j j |   |  _ t j d | d  |  j   d  S)Nz recreated blocker with handle %rr   )r   r   Z_rebuildr   r   r   r!   )r%   stater   r   r   __setstate__n   s    zSemLock.__setstate__c               C   s$   d t  j   j d t t j  f S)Nz%s-%sZ	semprefix)r   current_processZ_confignextr   _randr   r   r   r   r   s   s    zSemLock._make_nameN)__name__
__module____qualname__tempfileZ_RandomNameSequencer:   r,   staticmethodr$   r!   r0   r1   r5   r7   r   r   r   r   r   r   /   s   "	r   c               @   s7   e  Z d  Z d d d  Z d d   Z d d   Z d S)	r   r	   c            C   s    t  j |  t | t d | d  S)Nr)   )r   r,   	SEMAPHORESEM_VALUE_MAX)r%   r'   r)   r   r   r   r,   ~   s    zSemaphore.__init__c             C   s   |  j  j   S)N)r   
_get_value)r%   r   r   r   	get_value   s    zSemaphore.get_valuec             C   s6   y |  j  j   } Wn t k
 r- d } Yn Xd | S)Nunknownz<Semaphore(value=%s)>)r   rB   	Exception)r%   r'   r   r   r   __repr__   s
    zSemaphore.__repr__N)r;   r<   r=   r,   rC   rF   r   r   r   r   r   |   s   c               @   s+   e  Z d  Z d d d  Z d d   Z d S)r   r	   c            C   s    t  j |  t | | d | d  S)Nr)   )r   r,   r@   )r%   r'   r)   r   r   r   r,      s    zBoundedSemaphore.__init__c             C   sB   y |  j  j   } Wn t k
 r- d } Yn Xd | |  j  j f S)NrD   z)<BoundedSemaphore(value=%s, maxvalue=%s)>)r   rB   rE   r(   )r%   r'   r   r   r   rF      s    zBoundedSemaphore.__repr__N)r;   r<   r=   r,   rF   r   r   r   r   r      s   c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c            C   s    t  j |  t d d d | d  S)Nr	   r)   )r   r,   r@   )r%   r)   r   r   r   r,      s    zLock.__init__c             C   s   y |  j  j   rS t j   j } t j   j d k r | d t j   j 7} q nB |  j  j   d k rq d } n$ |  j  j   d k r d } n d } Wn t	 k
 r d } Yn Xd	 | S)
N
MainThread|r	   Noner   SomeOtherThreadSomeOtherProcessrD   z<Lock(owner=%s)>)
r   _is_miner   r8   r"   	threadingcurrent_threadrB   _countrE   )r%   r"   r   r   r   rF      s    		
zLock.__repr__N)r;   r<   r=   r,   rF   r   r   r   r   r      s   c               @   s(   e  Z d  Z d d   Z d d   Z d S)r   c            C   s    t  j |  t d d d | d  S)Nr	   r)   )r   r,   RECURSIVE_MUTEX)r%   r)   r   r   r   r,      s    zRLock.__init__c             C   s   y |  j  j   rb t j   j } t j   j d k rP | d t j   j 7} n  |  j  j   } nT |  j  j   d k r d \ } } n0 |  j  j   d k r d \ } } n d \ } } Wn t	 k
 r d \ } } Yn Xd
 | | f S)NrG   rH   r	   rI   r   rJ   nonzerorK   rD   z<RLock(%s, %s)>)zNoner   )zSomeOtherThreadrQ   )zSomeOtherProcessrQ   )unknownrR   )
r   rL   r   r8   r"   rM   rN   rO   rB   rE   )r%   r"   countr   r   r   rF      s    zRLock.__repr__N)r;   r<   r=   r,   rF   r   r   r   r   r      s   c               @   s   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d d  Z
 d d   Z d d   Z d d d  Z d S)r   Nc            C   sY   | p | j    |  _ | j d  |  _ | j d  |  _ | j d  |  _ |  j   d  S)Nr   )r   _lockr   _sleeping_count_woken_count_wait_semaphorer!   )r%   lockr)   r   r   r   r,      s
    zCondition.__init__c             C   s)   t  j |   |  j |  j |  j |  j f S)N)r
   r3   rT   rU   rV   rW   )r%   r   r   r   r5      s    zCondition.__getstate__c             C   s,   | \ |  _  |  _ |  _ |  _ |  j   d  S)N)rT   rU   rV   rW   r!   )r%   r6   r   r   r   r7      s    zCondition.__setstate__c             C   s   |  j  j   S)N)rT   r0   )r%   r   r   r   r0      s    zCondition.__enter__c             G   s   |  j  j |   S)N)rT   r1   )r%   r2   r   r   r   r1      s    zCondition.__exit__c             C   s"   |  j  j |  _ |  j  j |  _ d  S)N)rT   r.   r/   )r%   r   r   r   r!      s    zCondition._make_methodsc             C   sR   y& |  j  j j   |  j j j   } Wn t k
 r@ d } Yn Xd |  j | f S)NrD   z<Condition(%s, %s)>)rU   r   rB   rV   rE   rT   )r%   Znum_waitersr   r   r   rF      s    zCondition.__repr__c             C   s   |  j  j j   s t d   |  j j   |  j  j j   } x! t |  D] } |  j  j   qJ Wz |  j j	 d |  SWd  |  j
 j   x! t |  D] } |  j  j	   q WXd  S)Nz,must acquire() condition before using wait()T)rT   r   rL   AssertionErrorrU   r/   rO   r   rW   r.   rV   )r%   timeoutrS   r*   r   r   r   wait   s    	zCondition.waitc             C   s   |  j  j j   s t d   |  j j d  s7 t  x4 |  j j d  rm |  j j d  } | s: t  q: W|  j j d  r |  j j   |  j j   |  j j d  n  d  S)Nzlock is not ownedF)	rT   r   rL   rY   rW   r.   rV   rU   r/   )r%   resr   r   r   notify  s    zCondition.notifyc             C   s   |  j  j j   s t d   |  j j d  s7 t  x4 |  j j d  rm |  j j d  } | s: t  q: Wd } x- |  j j d  r |  j j   | d 7} qw W| r x! t	 |  D] } |  j j   q Wx |  j j d  r q Wn  d  S)Nzlock is not ownedFr   r	   )
rT   r   rL   rY   rW   r.   rV   rU   r/   r   )r%   r\   Zsleepersr*   r   r   r   
notify_all   s    zCondition.notify_allc             C   s   |   } | r | S| d  k	 r/ t    | } n d  } d  } xL | s | d  k	 rp | t    } | d k rp Pqp n  |  j |  |   } q> W| S)Nr   )_timer[   )r%   Z	predicaterZ   resultZendtimeZwaittimer   r   r   wait_for7  s    		zCondition.wait_for)r;   r<   r=   r,   r5   r7   r0   r1   r!   rF   r[   r]   r^   ra   r   r   r   r   r      s   c               @   sO   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
 d  Z d	 S)r   c            C   s.   | j  | j    |  _ | j d  |  _ d  S)Nr   )r   r   _condr   _flag)r%   r)   r   r   r   r,   O  s    zEvent.__init__c          
   C   sM   |  j  j   z+ |  j j d  r3 |  j j   d Sd SWd  |  j  j   Xd  S)NFT)rb   r.   rc   r/   )r%   r   r   r   is_setS  s    zEvent.is_setc          
   C   sP   |  j  j   z. |  j j d  |  j j   |  j  j   Wd  |  j  j   Xd  S)NF)rb   r.   rc   r/   r^   )r%   r   r   r   set]  s    z	Event.setc          
   C   s6   |  j  j   z |  j j d  Wd  |  j  j   Xd  S)NF)rb   r.   rc   r/   )r%   r   r   r   clearf  s    zEvent.clearNc          
   C   s   |  j  j   z] |  j j d  r2 |  j j   n |  j  j |  |  j j d  re |  j j   d Sd SWd  |  j  j   Xd  S)NFT)rb   r.   rc   r/   r[   )r%   rZ   r   r   r   r[   m  s    z
Event.wait)r;   r<   r=   r,   rd   re   rf   r[   r   r   r   r   r   M  s
   
	c               @   s   e  Z d  Z d d d d  Z d d   Z d d   Z e d d	    Z e j d
 d	    Z e d d    Z	 e	 j d d    Z	 d S)BarrierNc      	      C   ss   d d  l  } d d l m } | | j d  d  } | j   } |  j | | | | | f  d |  _ d |  _ d  S)Nr   r	   )BufferWrapperr*   r   )structheaprh   Zcalcsizer   r7   _staterO   )	r%   ZpartiesactionrZ   r)   ri   rh   wrapperZcondr   r   r   r,     s    	zBarrier.__init__c             C   sC   | \ |  _  |  _ |  _ |  _ |  _ |  j j   j d  |  _ d  S)Nr*   )_parties_action_timeoutrb   _wrapperZcreate_memoryviewcast_array)r%   r6   r   r   r   r7     s    $zBarrier.__setstate__c             C   s"   |  j  |  j |  j |  j |  j f S)N)rn   ro   rp   rb   rq   )r%   r   r   r   r5     s    zBarrier.__getstate__c             C   s   |  j  d S)Nr   )rs   )r%   r   r   r   rk     s    zBarrier._statec             C   s   | |  j  d <d  S)Nr   )rs   )r%   r'   r   r   r   rk     s    c             C   s   |  j  d S)Nr	   )rs   )r%   r   r   r   rO     s    zBarrier._countc             C   s   | |  j  d <d  S)Nr	   )rs   )r%   r'   r   r   r   rO     s    )
r;   r<   r=   r,   r7   r5   propertyrk   setterrO   r   r   r   r   rg     s   	rg   )__all__rM   r   r>   r   r   r_    r
   r   r   r   r   ImportErrorlistr   rP   r@   rA   objectr   r   r   r   r   r   rg   r   r   r   r   <module>   s0   Mz3