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   )Z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   Z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%   r/   r   )r$   r/   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   r2   ^   s    zSemLock.__enter__c             G   s   | j j|Ž S )N)r   Ú__exit__)r'   Úargsr   r   r   r3   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Ú_RandomNameSequencerA   r.   Ústaticmethodr&   r#   r2   r3   r9   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   r.   Ú	SEMAPHOREÚSEM_VALUE_MAX)r'   r)   r+   r   r   r   r.   }   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   rJ   Ú	ExceptionÚ	__class__rB   )r'   r)   r   r   r   Ú__repr__ƒ   s
    
zSemaphore.__repr__N)r   )rB   rC   rD   r.   rK   rO   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   r.   rH   )r'   r)   r+   r   r   r   r.      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 )NrL   z<%s(value=%s, maxvalue=%s)>)r   rJ   rM   rN   rB   r*   )r'   r)   r   r   r   rO   “   s    
zBoundedSemaphore.__repr__N)r   )rB   rC   rD   r.   rO   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.   rH   )r'   r+   r   r   r   r.   ¡   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ÚSomeOtherProcessrL   z<%s(owner=%s)>)r   Ú_is_miner
   r>   r$   Ú	threadingÚcurrent_threadrJ   Ú_countrM   rN   rB   )r'   r$   r   r   r   rO   ¤   s    


zLock.__repr__N)rB   rC   rD   r.   rO   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  ¡ 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 )
NrP   rQ   r   )rR   r   r   )rS   Únonzero)rT   rZ   )rL   rL   z<%s(%s, %s)>)r   rU   r
   r>   r$   rV   rW   rX   rJ   rM   rN   rB   )r'   r$   Úcountr   r   r   rO   ½   s    



zRLock.__repr__N)rB   rC   rD   r.   rO   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   r.   Ô   s
    zCondition.__init__c             C   s   t  | ¡ | j| j| j| jfS )N)r	   r5   r\   r]   r^   r_   )r'   r   r   r   r9   Û   s    
zCondition.__getstate__c             C   s    |\| _ | _| _| _|  ¡  d S )N)r\   r]   r^   r_   r#   )r'   r;   r   r   r   r<   à   s    zCondition.__setstate__c             C   s
   | j  ¡ S )N)r\   r2   )r'   r   r   r   r2   å   s    zCondition.__enter__c             G   s   | j j|Ž S )N)r\   r3   )r'   r4   r   r   r   r3   è   s    zCondition.__exit__c             C   s   | j j| _| j j| _d S )N)r\   r0   r1   )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 )NrL   z<%s(%s, %s)>)r]   r   rJ   r^   rM   rN   rB   r\   )r'   Znum_waitersr   r   r   rO   ï   s    

zCondition.__repr__c          	   C   s‚   | j j ¡ stdƒ‚| j ¡  | j j ¡ }xt|ƒD ]}| j  ¡  q4W z| j 	d|¡S | j
 ¡  xt|ƒD ]}| j  	¡  qjW X d S )Nz,must acquire() condition before using wait()T)r\   r   rU   ÚAssertionErrorr]   r1   rX   r   r_   r0   r^   )r'   Útimeoutr[   r,   r   r   r   Úwait÷   s    

zCondition.waitr   c             C   s¸   | j j ¡ stdƒ‚| j d¡r(tdƒ‚x(| j d¡rP| j d¡}|s*tdƒ‚q*W d}x*||k r€| j d¡r€| j ¡  |d7 }qXW |r´xt	|ƒD ]}| j ¡  qW x| j d¡r²q¤W d S )Nzlock is not ownedFz;notify: Should not have been able to acquire_wait_semaphorez>notify: Bug in sleeping_count.acquire- res should not be Falser   r   )
r\   r   rU   ra   r_   r0   r^   r]   r1   r   )r'   ÚnÚresZsleepersr,   r   r   r   Únotify  s    
zCondition.notifyc             C   s   | j tjd d S )N)rd   )rf   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Ú	monotonicrc   )r'   Ú	predicaterb   ÚresultÚendtimeÚwaittimer   r   r   Úwait_for+  s    

zCondition.wait_for)N)N)r   )N)rB   rC   rD   r.   r9   r<   r2   r3   r#   rO   rc   rf   rh   ro   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   r.   C  s    zEvent.__init__c          	   C   s0   | j   | j d¡r"| j ¡  dS dS Q R X d S )NFT)rp   rq   r0   r1   )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)rp   rq   r0   r1   rh   )r'   r   r   r   ÚsetN  s    
z	Event.setc          	   C   s"   | j  | j d¡ W d Q R X d S )NF)rp   rq   r0   )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)rp   rq   r0   r1   rc   )r'   rb   r   r   r   rc   X  s    
z
Event.wait)N)rB   rC   rD   r.   rr   rs   rt   rc   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Úheaprv   Úcalcsizer   r<   Ú_staterX   )	r'   ÚpartiesÚactionrb   r+   rw   rv   ÚwrapperZcondr   r   r   r.   j  s    zBarrier.__init__c             C   s.   |\| _ | _| _| _| _| j ¡  d¡| _d S )Nr,   )Ú_partiesÚ_actionÚ_timeoutrp   Ú_wrapperZ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€   rp   r   )r'   r   r   r   r9   x  s    zBarrier.__getstate__c             C   s
   | j d S )Nr   )rƒ   )r'   r   r   r   rz   |  s    zBarrier._statec             C   s   || j d< d S )Nr   )rƒ   )r'   r)   r   r   r   rz   €  s    c             C   s
   | j d S )Nr   )rƒ   )r'   r   r   r   rX   „  s    zBarrier._countc             C   s   || j d< d S )Nr   )rƒ   )r'   r)   r   r   r   rX   ˆ  s    )NN)
rB   rC   rD   r.   r<   r9   Úpropertyrz   ÚsetterrX   r   r   r   r   ru   h  s   
	ru   )Ú__all__rV   r   rE   r   ri   Ú r	   r
   r   r   r   ÚImportErrorÚlistr   rY   rH   rI   Úobjectr   r   r   r   r   r   ru   r   r   r   r   Ú<module>   s.   Mo'