a
    IfZ-                     @   s"  g d 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y   edY n0 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_unlinkzThis 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 u rt j }| }tjdkp*|dk}tdD ]<}z t|||| 	 | }| _
W n tyj   Y q40  qzq4tdtd|j  |   tjdkrdd }	t| |	 | j
jd urdd	lm}
 |
| j
jd
 tj| tj| j
jfdd d S )Nwin32forkd   zcannot find name for semaphorezcreated semlock with handle %sc                 S   s   | j   d S N)_semlock_after_fork)obj r   ,lib/python3.9/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   s2    

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   s6   z| j  }W n ty$   d}Y n0 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   
r   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y$   d}Y n0 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   
r   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	y|   d}Y n0 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   r   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	y   d\}}Y n0 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   r   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   sH   z| j j | jj  }W n ty2   d}Y n0 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J d| j  | j j }t|D ]}| j   q2zD| jd|W | j	  t|D ]}| j   qdS ]}| j   qvn$| j	  t|D ]}| j   q0 d S )Nz,must acquire() condition before using wait()T)
rb   r   rY   rc   r0   r\   r   re   r/   rd   )r&   timeoutr`   r+   r   r   r   wait   s&    

 
zCondition.waitr   c                 C   s   | j j sJ d| jdr(J d| jdrN| jd}|s(J dq(d}||k rz| jdrz| j  |d7 }qR|rt|D ]}| j  q| jdrqd 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   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)ri   )rk   r   maxsizer1   r   r   r   
notify_all(  s    zCondition.notify_allc                 C   sd   | }|r|S |d ur$t  | }nd }d }|s`|d urN|t   }|dkrNq`| | | }q,|S ra   )time	monotonicrh   )r&   Z	predicaterg   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   rh   rk   rm   rq   r   r   r   r   r      s   


r   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   sR   | j 8 | jdr.| j  W d    dS W d    dS 1 sD0    Y  d S NFT)rr   rs   r/   r0   r1   r   r   r   is_setG  s
    
zEvent.is_setc                 C   sJ   | j 0 | jd | j  | j   W d    n1 s<0    Y  d S NF)rr   rs   r/   r0   rm   r1   r   r   r   setN  s    
z	Event.setc                 C   s6   | j  | jd W d    n1 s(0    Y  d S rv   )rr   rs   r/   r1   r   r   r   clearT  s    zEvent.clearNc                 C   sv   | j \ | jdr | j  n| j | | jdrR| j  W d    dS W d    dS 1 sh0    Y  d S rt   )rr   rs   r/   r0   rh   )r&   rg   r   r   r   rh   X  s    
z
Event.wait)N)r?   r@   rA   r-   ru   rw   rx   rh   r   r   r   r   r   A  s
   r   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heaprz   Zcalcsizer   r;   _stater\   )	r&   Zpartiesactionrg   r*   r{   rz   wrapperZcondr   r   r   r-   j  s    zBarrier.__init__c                 C   s.   |\| _ | _| _| _| _| j d| _d S )Nr+   )_parties_action_timeoutrr   _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   rr   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   ry   h  s   
	


ry   )__all__rZ   r   rB   r   rn    r	   r
   r   r   r   ImportErrorlistr   r]   rF   rG   objectr   r   r   r   r   r   ry   r   r   r   r   <module>
   s,   	Mo'