B
    18™\A-  ã               @   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Zdd	lmZ dd
lmZ ddlm	Z	 yddlm
Z
mZ W n ek
rŒ   edƒ‚Y nX eedƒƒ\ZZej
jZG dd„ deƒZ
G dd„ de
ƒZG dd„ deƒZG dd „ d e
ƒZG dd„ de
ƒZG dd„ deƒZG dd„ deƒZG dd„ dejƒZdS )ÚLockÚRLockÚ	SemaphoreÚBoundedSemaphoreÚ	ConditionÚEventé    Né   )Úcontext)Úprocess)Úutil)ÚSemLockÚ
sem_unlinkz—This platform lacks a functioning sem_open implementation, therefore, the required synchronization primitives needed will not function, see issue 3770.é   c               @   s\   e Zd Ze ¡ 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   sö   |d krt j ¡ }| ¡ }tjdkp*|dk}xPtdƒD ]<}y t ||||  	¡ |¡ }| _
W n tk
rn   Y q6X P q6W tdƒ‚t d|j ¡ |  ¡  tjdkr´dd„ }	t | |	¡ | j
jd k	ròdd	lm}
 |
| j
jƒ tj| tj| j
jfd
d d S )NÚwin32Úforkéd   zcannot find name for semaphorezcreated semlock with handle %sc             S   s   | j  ¡  d S )N)Ú_semlockÚ_after_fork)Úobj© r   ú_/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/multiprocessing/synchronize.pyr   G   s    z%SemLock.__init__.<locals>._after_forkr   )Úregisterr   )Úexitpriority)r	   Ú_default_contextÚget_contextÚget_start_methodÚsysÚplatformÚrangeÚ_multiprocessingr   Ú
_make_namer   ÚFileExistsErrorr   ÚdebugÚhandleÚ_make_methodsZregister_after_forkÚnameÚsemaphore_trackerr   ÚFinalizeÚ_cleanup)ÚselfÚkindÚvalueÚmaxvalueÚctxr%   Z
unlink_nowÚiÚslr   r   r   r   r   Ú__init__2   s.    

zSemLock.__init__c             C   s    ddl m} t| ƒ || ƒ d S )Nr   )Ú
unregister)r&   r1   r   )r%   r1   r   r   r   r(   T   s    zSemLock._cleanupc             C   s   | j j| _| j j| _d S )N)r   ÚacquireÚrelease)r)   r   r   r   r$   Z   s    
zSemLock._make_methodsc             C   s
   | j  ¡ S )N)r   Ú	__enter__)r)   r   r   r   r4   ^   s    zSemLock.__enter__c             G   s   | j j|Ž S )N)r   Ú__exit__)r)   Úargsr   r   r   r5   a   s    zSemLock.__exit__c             C   sD   t  | ¡ | j}tjdkr,t  ¡  |j¡}n|j}||j|j	|j
fS )Nr   )r	   Úassert_spawningr   r   r   Úget_spawning_popenÚduplicate_for_childr#   r*   r,   r%   )r)   r/   Úhr   r   r   Ú__getstate__d   s    

zSemLock.__getstate__c             C   s,   t jj|Ž | _t d|d  ¡ |  ¡  d S )Nz recreated blocker with handle %rr   )r   r   Ú_rebuildr   r   r"   r$   )r)   Ústater   r   r   Ú__setstate__m   s    zSemLock.__setstate__c               C   s   dt  ¡ jd ttjƒf S )Nz%s-%sÚ	semprefix)r
   Úcurrent_processÚ_configÚnextr   Ú_randr   r   r   r   r    r   s    zSemLock._make_nameN)Ú__name__Ú
__module__Ú__qualname__ÚtempfileÚ_RandomNameSequencerC   r0   Ústaticmethodr(   r$   r4   r5   r;   r>   r    r   r   r   r   r   .   s   "	r   c               @   s&   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 )N)r-   )r   r0   Ú	SEMAPHOREÚSEM_VALUE_MAX)r)   r+   r-   r   r   r   r0   }   s    zSemaphore.__init__c             C   s
   | j  ¡ S )N)r   Ú
_get_value)r)   r   r   r   Ú	get_value€   s    zSemaphore.get_valuec             C   s8   y| j  ¡ }W n tk
r&   d}Y nX d| jj|f S )NÚunknownz<%s(value=%s)>)r   rL   Ú	ExceptionÚ	__class__rD   )r)   r+   r   r   r   Ú__repr__ƒ   s
    
zSemaphore.__repr__N)r   )rD   rE   rF   r0   rM   rQ   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 )N)r-   )r   r0   rJ   )r)   r+   r-   r   r   r   r0      s    zBoundedSemaphore.__init__c             C   s>   y| j  ¡ }W n tk
r&   d}Y nX d| jj|| j jf S )NrN   z<%s(value=%s, maxvalue=%s)>)r   rL   rO   rP   rD   r,   )r)   r+   r   r   r   rQ   “   s    
zBoundedSemaphore.__repr__N)r   )rD   rE   rF   r0   rQ   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   r0   rJ   )r)   r-   r   r   r   r0   ¡   s    zLock.__init__c             C   s   yf| j  ¡ r8t ¡ j}t ¡ jdkrd|dt ¡ j 7 }n,| j  ¡ dkrLd}n| j  ¡ dkr`d}nd}W n t	k
r~   d}Y nX d	| j
j|f S )
NÚ
MainThreadú|r   ÚNoner   ÚSomeOtherThreadÚSomeOtherProcessrN   z<%s(owner=%s)>)r   Ú_is_miner
   r@   r%   Ú	threadingÚcurrent_threadrL   Ú_countrO   rP   rD   )r)   r%   r   r   r   rQ   ¤   s    


zLock.__repr__N)rD   rE   rF   r0   rQ   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   r0   ÚRECURSIVE_MUTEX)r)   r-   r   r   r   r0   º   s    zRLock.__init__c             C   s¬   y|| j  ¡ rBt ¡ j}t ¡ jdkr6|dt ¡ j 7 }| j  ¡ }n8| j  ¡ dkrZd\}}n | j  ¡ dkrrd\}}nd\}}W n t	k
r˜   d\}}Y nX d	| j
j||f S )
NrR   rS   r   )rT   r   r   )rU   Únonzero)rV   r\   )rN   rN   z<%s(%s, %s)>)r   rW   r
   r@   r%   rX   rY   rZ   rL   rO   rP   rD   )r)   r%   Úcountr   r   r   rQ   ½   s    



zRLock.__repr__N)rD   rE   rF   r0   rQ   r   r   r   r   r   ¸   s   c               @   sl   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d„Zdd„ Zddd„ZdS )r   Nc            C   s>   |p
|  ¡ | _| d¡| _| d¡| _| d¡| _|  ¡  d S )Nr   )r   Ú_lockr   Ú_sleeping_countÚ_woken_countÚ_wait_semaphorer$   )r)   Úlockr-   r   r   r   r0   Ô   s
    zCondition.__init__c             C   s   t  | ¡ | j| j| j| jfS )N)r	   r7   r^   r_   r`   ra   )r)   r   r   r   r;   Û   s    
zCondition.__getstate__c             C   s    |\| _ | _| _| _|  ¡  d S )N)r^   r_   r`   ra   r$   )r)   r=   r   r   r   r>   à   s    zCondition.__setstate__c             C   s
   | j  ¡ S )N)r^   r4   )r)   r   r   r   r4   å   s    zCondition.__enter__c             G   s   | j j|Ž S )N)r^   r5   )r)   r6   r   r   r   r5   è   s    zCondition.__exit__c             C   s   | j j| _| j j| _d S )N)r^   r2   r3   )r)   r   r   r   r$   ë   s    
zCondition._make_methodsc             C   sJ   y| j j ¡ | jj ¡  }W n tk
r4   d}Y nX d| jj| j|f S )NrN   z<%s(%s, %s)>)r_   r   rL   r`   rO   rP   rD   r^   )r)   Znum_waitersr   r   r   rQ   ï   s    

zCondition.__repr__c          	   C   sn   | j  ¡  | jj ¡ }xt|ƒD ]}| j ¡  q W z| j d|¡S | j ¡  xt|ƒD ]}| j ¡  qVW X d S )NT)	r_   r3   r^   r   rZ   r   ra   r2   r`   )r)   Útimeoutr]   r.   r   r   r   Úwait÷   s    

zCondition.waitr   c             C   s„   x| j  d¡r| j d¡}qW d}x*||k rL| j d¡rL| j ¡  |d7 }q$W |r€xt|ƒD ]}| j  ¡  q\W x| j d¡r~qpW d S )NFr   r   )r`   r2   r_   ra   r3   r   )r)   ÚnÚresÚsleepersr.   r   r   r   Únotify  s    
zCondition.notifyc             C   s   | j tjd d S )N)re   )rh   r   Úmaxsize)r)   r   r   r   Ú
notify_all(  s    zCondition.notify_allc             C   sh   |ƒ }|r|S |d k	r$t  ¡ | }nd }d }x6|sb|d k	rP|t  ¡  }|dkrPP |  |¡ |ƒ }q.W |S )Nr   )ÚtimeÚ	monotonicrd   )r)   Ú	predicaterc   ÚresultÚendtimeÚwaittimer   r   r   Úwait_for+  s    

zCondition.wait_for)N)N)r   )N)rD   rE   rF   r0   r;   r>   r4   r5   r$   rQ   rd   rh   rj   rq   r   r   r   r   r   Ò   s   


c               @   s6   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    |  | ¡ ¡| _| d¡| _d S )Nr   )r   r   Ú_condr   Ú_flag)r)   r-   r   r   r   r0   C  s    zEvent.__init__c          	   C   s0   | j   | j d¡r"| j ¡  dS dS Q R X d S )NFT)rr   rs   r2   r3   )r)   r   r   r   Úis_setG  s
    
zEvent.is_setc          	   C   s6   | j & | j d¡ | j ¡  | j  ¡  W d Q R X d S )NF)rr   rs   r2   r3   rj   )r)   r   r   r   ÚsetN  s    
z	Event.setc          	   C   s"   | j  | j d¡ W d Q R X d S )NF)rr   rs   r2   )r)   r   r   r   ÚclearT  s    zEvent.clearNc          	   C   sT   | j D | j d¡r | j ¡  n| j  |¡ | j d¡rF| j ¡  dS dS Q R X d S )NFT)rr   rs   r2   r3   rd   )r)   rc   r   r   r   rd   X  s    
z
Event.wait)N)rD   rE   rF   r0   rt   ru   rv   rd   r   r   r   r   r   A  s
   c               @   sZ   e Zd Z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   sR   dd l }ddlm} || d¡d ƒ}| ¡ }|  |||||f¡ d| _d| _d S )Nr   r   )ÚBufferWrapperr.   r   )ÚstructÚheaprx   Úcalcsizer   r>   Ú_staterZ   )	r)   ÚpartiesÚactionrc   r-   ry   rx   ÚwrapperÚcondr   r   r   r0   j  s    zBarrier.__init__c             C   s.   |\| _ | _| _| _| _| j ¡  d¡| _d S )Nr.   )Ú_partiesÚ_actionÚ_timeoutrr   Ú_wrapperÚcreate_memoryviewÚcastÚ_array)r)   r=   r   r   r   r>   s  s    zBarrier.__setstate__c             C   s   | j | j| j| j| jfS )N)r   r‚   rƒ   rr   r„   )r)   r   r   r   r;   x  s    zBarrier.__getstate__c             C   s
   | j d S )Nr   )r‡   )r)   r   r   r   r|   |  s    zBarrier._statec             C   s   || j d< d S )Nr   )r‡   )r)   r+   r   r   r   r|   €  s    c             C   s
   | j d S )Nr   )r‡   )r)   r   r   r   rZ   „  s    zBarrier._countc             C   s   || j d< d S )Nr   )r‡   )r)   r+   r   r   r   rZ   ˆ  s    )NN)
rD   rE   rF   r0   r>   r;   Úpropertyr|   ÚsetterrZ   r   r   r   r   rw   h  s   
	rw   )Ú__all__rX   r   rG   r   rk   Ú r	   r
   r   r   r   ÚImportErrorÚlistr   r[   rJ   rK   Úobjectr   r   r   r   r   r   rw   r   r   r   r   Ú<module>   s.   Mo'