o
    HbZ-                     @   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w 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y5   Y qw  ntdtd|j  |   tjdkrWdd }	t| |	 | j
jd urydd	lm}
 |
| j
jd
 tj| tj| j
jfdd d S 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   2/usr/lib/python3.10/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   s6   


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      | j j| _| j j| _d S r   )r   acquirereleaser&   r   r   r   r"   Z      
zSemLock._make_methodsc                 C   
   | j  S r   )r   	__enter__r2   r   r   r   r5   ^      
zSemLock.__enter__c                 G      | j j| S r   )r   __exit__r&   argsr   r   r   r8   a      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_RandomNameSequencerD   r-   staticmethodr%   r"   r5   r8   r>   rA   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-   }      zSemaphore.__init__c                 C   r4   r   )r   
_get_valuer2   r   r   r   	get_value   r6   zSemaphore.get_valuec                 C   s6   z| j  }W n ty   d}Y nw d| jj|f S )Nunknownz<%s(value=%s)>)r   rP   	Exception	__class__rE   r&   r(   r   r   r   __repr__   s   zSemaphore.__repr__Nr   )rE   rF   rG   r-   rQ   rV   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 rJ   r   r-   rL   rN   r   r   r   r-      rO   zBoundedSemaphore.__init__c                 C   s<   z| j  }W n ty   d}Y nw d| jj|| j jf S )NrR   z<%s(value=%s, maxvalue=%s)>)r   rP   rS   rT   rE   r)   rU   r   r   r   rV      s   zBoundedSemaphore.__repr__NrW   rE   rF   rG   r-   rV   r   r   r   r   r      s    
r   c                   @      e Zd Zdd Zdd ZdS )r   c                C      t j| tdd|d d S Nr   rK   rX   r&   r*   r   r   r   r-      rO   zLock.__init__c                 C   s   z3| j  rt j}t jdkr|dt j 7 }n| j  dkr&d}n| j  dkr0d}nd}W n t	y>   d}Y nw d	| j
j|f S )
N
MainThread|r   Noner   SomeOtherThreadSomeOtherProcessrR   z<%s(owner=%s)>)r   _is_miner
   rB   r#   	threadingcurrent_threadrP   _countrS   rT   rE   )r&   r#   r   r   r   rV      s    

zLock.__repr__NrY   r   r   r   r   r          r   c                   @   rZ   )r   c                C   r[   r\   )r   r-   RECURSIVE_MUTEXr]   r   r   r   r-      rO   zRLock.__init__c                 C   s   z>| j  r!t j}t jdkr|dt j 7 }| j  }n| j  dkr-d\}}n| j  dkr9d\}}nd\}}W n t	yK   d\}}Y nw d	| j
j||f S )
Nr^   r_   r   )r`   r   r   )ra   nonzero)rb   ri   )rR   rR   <%s(%s, %s)>)r   rc   r
   rB   r#   rd   re   rf   rP   rS   rT   rE   )r&   r#   countr   r   r   rV      s    



zRLock.__repr__NrY   r   r   r   r   r      rg   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	   r<   rm   rn   ro   rp   r2   r   r   r   r>      s   
zCondition.__getstate__c                 C   s    |\| _ | _| _| _|   d S r   )rm   rn   ro   rp   r"   r?   r   r   r   rA      s   
zCondition.__setstate__c                 C   r4   r   )rm   r5   r2   r   r   r   r5      r6   zCondition.__enter__c                 G   r7   r   )rm   r8   r9   r   r   r   r8      r;   zCondition.__exit__c                 C   r/   r   )rm   r0   r1   r2   r   r   r   r"      r3   zCondition._make_methodsc                 C   sH   z| j j | jj  }W n ty   d}Y nw d| jj| j|f S )NrR   rj   )rn   r   rP   ro   rS   rT   rE   rm   )r&   Znum_waitersr   r   r   rV      s   

zCondition.__repr__c              	   C   s   | j j s
J d| j  | j j }t|D ]}| j   qz| jd|W | j	  t|D ]}| j   q2S | j	  t|D ]}| j   qDw )Nz,must acquire() condition before using wait()T)
rm   r   rc   rn   r1   rf   r   rp   r0   ro   )r&   timeoutrk   r+   r   r   r   wait   s"   


zCondition.waitr   c                 C   s   | j j s
J d| jdrJ d| jdr,| jd}|s&J d| jdsd}||k rK| jdrK| j  |d7 }||k rK| jds8|rht|D ]}| j  qQ| jdrj	 | jds_d S d S 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   )	rm   r   rc   rp   r0   ro   rn   r1   r   )r&   nresZsleepersr+   r   r   r   notify  s.   
zCondition.notifyc                 C   s   | j tjd d S )N)rt   )rv   r   maxsizer2   r   r   r   
notify_all(  s   zCondition.notify_allc                 C   sj   | }|r|S |d urt  | }nd }d }|s3|d ur)|t   }|dkr)	 |S | | | }|r|S rl   )time	monotonicrs   )r&   Z	predicaterr   resultZendtimeZwaittimer   r   r   wait_for+  s"   
zCondition.wait_forr   rW   )rE   rF   rG   r-   r>   rA   r5   r8   r"   rV   rs   rv   rx   r|   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 rl   )r   r   _condr   _flagr]   r   r   r   r-   C  s   zEvent.__init__c                 C   sV   | j  | jdr| j  	 W d    dS 	 W d    dS 1 s$w   Y  d S NFT)r}   r~   r0   r1   r2   r   r   r   is_setG  s   
$zEvent.is_setc                 C   sL   | j  | jd | j  | j   W d    d S 1 sw   Y  d S NF)r}   r~   r0   r1   rx   r2   r   r   r   setN  s
   
"z	Event.setc                 C   s8   | j  | jd W d    d S 1 sw   Y  d S r   )r}   r~   r0   r2   r   r   r   clearT  s   "zEvent.clearNc                 C   sz   | j 0 | jdr| j  n| j | | jdr*| j  	 W d    dS 	 W d    dS 1 s6w   Y  d S r   )r}   r~   r0   r1   rs   )r&   rr   r   r   r   rs   X  s   
	$z
Event.waitr   )rE   rF   rG   r-   r   r   r   rs   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   )structZheapr   Zcalcsizer   rA   _staterf   )	r&   Zpartiesactionrr   r*   r   r   wrapperZcondr   r   r   r-   j  s   
zBarrier.__init__c                 C   s.   |\| _ | _| _| _| _| j d| _d S )Nr+   )_parties_action_timeoutr}   _wrapperZcreate_memoryviewcast_arrayr?   r   r   r   rA   s  s   zBarrier.__setstate__c                 C   s   | j | j| j| j| jfS r   )r   r   r   r}   r   r2   r   r   r   r>   x  s   zBarrier.__getstate__c                 C   
   | j d S rl   r   r2   r   r   r   r   |     
zBarrier._statec                 C      || j d< d S rl   r   rU   r   r   r   r        c                 C   r   Nr   r   r2   r   r   r   rf     r   zBarrier._countc                 C   r   r   r   rU   r   r   r   rf     r   )NN)
rE   rF   rG   r-   rA   r>   propertyr   setterrf   r   r   r   r   r   h  s    
	


r   )__all__rd   r   rH   r   ry    r	   r
   r   r   r   ImportErrorlistr   rh   rL   rM   objectr   r   r   r   r   r   r   r   r   r   r   <module>   s0   	
Mo'