U
    ”¼pdZ-  ã                   @   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	 z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}tdƒD ]>}z t ||||  	¡ |¡ }| _
W n tk
rl   Y q4X  q|q4tdƒ‚t d|j ¡ |  ¡  tjdkr²dd„ }	t | |	¡ | j
jd k	ròdd	lm}
 |
| j
jd
ƒ 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   ú1/usr/lib/python3.8/multiprocessing/synchronize.pyr   G   s    z%SemLock.__init__.<locals>._after_forkr   )ÚregisterÚ	semaphorer   )Zexitpriority)r	   Z_default_contextZget_contextZget_start_methodÚsysÚplatformÚrangeÚ_multiprocessingr   Ú
_make_namer   ÚFileExistsErrorr   ÚdebugÚhandleÚ_make_methodsZregister_after_forkÚnameÚresource_trackerr   ZFinalizeÚ_cleanup)ÚselfÚkindÚvalueÚmaxvalueÚctxr#   Z
unlink_nowÚiÚslr   r   r   r   r   Ú__init__2   s8    
   þ
ÿzSemLock.__init__c                 C   s"   ddl m} t| ƒ || dƒ d S )Nr   )Ú
unregisterr   )r$   r.   r   )r#   r.   r   r   r   r%   T   s    zSemLock._cleanupc                 C   s   | j j| _| j j| _d S r   )r   ÚacquireÚrelease©r&   r   r   r   r"   Z   s    
zSemLock._make_methodsc                 C   s
   | j  ¡ S r   )r   Ú	__enter__r1   r   r   r   r2   ^   s    zSemLock.__enter__c                 G   s   | j j|Ž S r   )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   Zget_spawning_popenZ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   Z_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-%sZ	semprefix)r
   Úcurrent_processZ_configÚnextr   Ú_randr   r   r   r   r   r   s    ÿzSemLock._make_nameN)Ú__name__Ú
__module__Ú__qualname__ÚtempfileZ_RandomNameSequencer>   r-   Ústaticmethodr%   r"   r2   r3   r8   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 r   )r   Ú
_get_valuer1   r   r   r   Ú	get_value€   s    zSemaphore.get_valuec                 C   s8   z| j  ¡ }W n tk
r&   d}Y nX d| jj|f S )NÚunknownz<%s(value=%s)>)r   rI   Ú	ExceptionÚ	__class__r?   ©r&   r(   r   r   r   Ú__repr__ƒ   s
    
zSemaphore.__repr__N)r   )r?   r@   rA   r-   rJ   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 rD   ©r   r-   rF   rH   r   r   r   r-      s    zBoundedSemaphore.__init__c                 C   s>   z| j  ¡ }W n tk
r&   d}Y nX d| jj|| j jf S )NrK   z<%s(value=%s, maxvalue=%s)>)r   rI   rL   rM   r?   r)   rN   r   r   r   rO   “   s    
ÿzBoundedSemaphore.__repr__N)r   ©r?   r@   rA   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   rE   rP   ©r&   r*   r   r   r   r-   ¡   s    zLock.__init__c                 C   s   zf| 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ÚSomeOtherProcessrK   z<%s(owner=%s)>)r   Ú_is_miner
   r<   r#   Ú	threadingÚcurrent_threadrI   Ú_countrL   rM   r?   )r&   r#   r   r   r   rO   ¤   s    


zLock.__repr__NrQ   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 rR   )r   r-   ÚRECURSIVE_MUTEXrS   r   r   r   r-   º   s    zRLock.__init__c                 C   s¬   z|| 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 )
NrT   rU   r   )rV   r   r   )rW   Únonzero)rX   r^   )rK   rK   ú<%s(%s, %s)>)r   rY   r
   r<   r#   rZ   r[   r\   rI   rL   rM   r?   )r&   r#   Úcountr   r   r   rO   ½   s    



zRLock.__repr__NrQ   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 r   )r	   r6   rb   rc   rd   re   r1   r   r   r   r8   Û   s
    
 ÿzCondition.__getstate__c                 C   s    |\| _ | _| _| _|  ¡  d S r   )rb   rc   rd   re   r"   r9   r   r   r   r;   à   s
    ÿ
 zCondition.__setstate__c                 C   s
   | j  ¡ S r   )rb   r2   r1   r   r   r   r2   å   s    zCondition.__enter__c                 G   s   | j j|Ž S r   )rb   r3   r4   r   r   r   r3   è   s    zCondition.__exit__c                 C   s   | j j| _| j j| _d S r   )rb   r/   r0   r1   r   r   r   r"   ë   s    
zCondition._make_methodsc                 C   sJ   z| j j ¡ | jj ¡  }W n tk
r4   d}Y nX d| jj| j|f S )NrK   r_   )rc   r   rI   rd   rL   rM   r?   rb   )r&   Znum_waitersr   r   r   rO   ï   s    

ÿ
zCondition.__repr__c              	   C   s~   | j j ¡ stdƒ‚| j ¡  | j j ¡ }t|ƒD ]}| j  ¡  q2z| j
 	d|¡W ¢S | j ¡  t|ƒD ]}| j  	¡  qhX d S )Nz,must acquire() condition before using wait()T)rb   r   rY   ÚAssertionErrorrc   r0   r\   r   rd   r/   re   )r&   Útimeoutr`   r+   r   r   r   Úwait÷   s    ÿ

zCondition.waitr   c                 C   s¨   | j j ¡ stdƒ‚| j d¡r(tdƒ‚| j d¡rN| j d¡}|s(tdƒ‚q(d}||k rz| j d¡rz| j ¡  |d7 }qR|r¤t	|ƒD ]}| j ¡  q†| j d¡r¤q–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   )
rb   r   rY   rg   re   r/   rd   rc   r0   r   )r&   ÚnÚresZsleepersr+   r   r   r   Únotify  s$    ÿÿ

zCondition.notifyc                 C   s   | j tjd d S )N)rj   )rl   r   Úmaxsizer1   r   r   r   Ú
notify_all(  s    zCondition.notify_allc                 C   sd   |ƒ }|r|S |d k	r$t  ¡ | }nd }d }|s`|d k	rN|t  ¡  }|dkrNq`|  |¡ |ƒ }q,|S ra   )ÚtimeÚ	monotonicri   )r&   Z	predicaterh   ÚresultZendtimeZwaittimer   r   r   Úwait_for+  s    
zCondition.wait_for)N)N)r   )N)r?   r@   rA   r-   r8   r;   r2   r3   r"   rO   ri   rl   rn   rr   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 ra   )r   r   Ú_condr   Ú_flagrS   r   r   r   r-   C  s    zEvent.__init__c              	   C   sD   | j 4 | j d¡r,| j ¡  W 5 Q R £ dS W 5 Q R £ dS Q R X d S ©NFT)rs   rt   r/   r0   r1   r   r   r   Úis_setG  s
    
zEvent.is_setc              	   C   s6   | j & | j d¡ | j ¡  | j  ¡  W 5 Q R X d S ©NF)rs   rt   r/   r0   rn   r1   r   r   r   ÚsetN  s    
z	Event.setc              	   C   s"   | j  | j d¡ W 5 Q R X d S rw   )rs   rt   r/   r1   r   r   r   ÚclearT  s    zEvent.clearNc              	   C   sh   | j X | j d¡r | j ¡  n| j  |¡ | j d¡rP| j ¡  W 5 Q R £ dS W 5 Q R £ dS Q R X d S ru   )rs   rt   r/   r0   ri   )r&   rh   r   r   r   ri   X  s    
z
Event.wait)N)r?   r@   rA   r-   rv   rx   ry   ri   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Úheapr{   Zcalcsizer   r;   Ú_stater\   )	r&   ZpartiesÚactionrh   r*   r|   r{   ÚwrapperZcondr   r   r   r-   j  s    zBarrier.__init__c                 C   s.   |\| _ | _| _| _| _| j ¡  d¡| _d S )Nr+   )Ú_partiesÚ_actionÚ_timeoutrs   Ú_wrapperZcreate_memoryviewÚcastÚ_arrayr9   r   r   r   r;   s  s
    ÿ zBarrier.__setstate__c                 C   s   | j | j| j| j| jfS r   )r   r‚   rƒ   rs   r„   r1   r   r   r   r8   x  s     ÿzBarrier.__getstate__c                 C   s
   | j d S ra   ©r†   r1   r   r   r   r~   |  s    zBarrier._statec                 C   s   || j d< d S ra   r‡   rN   r   r   r   r~   €  s    c                 C   s
   | j d S ©Nr   r‡   r1   r   r   r   r\   „  s    zBarrier._countc                 C   s   || j d< d S rˆ   r‡   rN   r   r   r   r\   ˆ  s    )NN)
r?   r@   rA   r-   r;   r8   Úpropertyr~   Úsetterr\   r   r   r   r   rz   h  s   
	


rz   )Ú__all__rZ   r   rB   r   ro   Ú r	   r
   r   r   r   ÚImportErrorÚlistr   r]   rF   rG   Úobjectr   r   r   r   r   r   rz   r   r   r   r   Ú<module>   s8        ÿ	Mo'