o
    fZ-                     @   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   )exitpriority)r	   _default_contextget_contextget_start_methodsysplatformrange_multiprocessingr   
_make_namer   FileExistsErrorr   debughandle_make_methodsregister_after_forknameresource_trackerr   Finalize_cleanup)selfkindvaluemaxvaluectxr(   
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)   r5   r   )r(   r5   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__r9   r   r   r   r<   ^      
zSemLock.__enter__c                 G      | j j| S r   )r   __exit__r,   argsr   r   r   r?   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   get_spawning_popenduplicate_for_childr%   r-   r/   r(   )r,   r3   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_RandomNameSequencerP   r4   staticmethodr+   r&   r<   r?   rG   rK   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r0   )r   r4   	SEMAPHORESEM_VALUE_MAXr,   r.   r0   r   r   r   r4   }      zSemaphore.__init__c                 C   r;   r   )r   
_get_valuer9   r   r   r   	get_value   r=   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   r]   	Exception	__class__rQ   r,   r.   r   r   r   __repr__   s   zSemaphore.__repr__Nr   )rQ   rR   rS   r4   r^   rc   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 rW   r   r4   rY   r[   r   r   r   r4      r\   zBoundedSemaphore.__init__c                 C   s<   z| j  }W n ty   d}Y nw d| jj|| j jf S )Nr_   z<%s(value=%s, maxvalue=%s)>)r   r]   r`   ra   rQ   r/   rb   r   r   r   rc      s   zBoundedSemaphore.__repr__Nrd   rQ   rR   rS   r4   rc   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   rX   re   r,   r0   r   r   r   r4      r\   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SomeOtherProcessr_   z<%s(owner=%s)>)r   _is_miner
   rM   r(   	threadingcurrent_threadr]   _countr`   ra   rQ   )r,   r(   r   r   r   rc      s    

zLock.__repr__Nrf   r   r   r   r   r          r   c                   @   rg   )r   c                C   rh   ri   )r   r4   RECURSIVE_MUTEXrj   r   r   r   r4      r\   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 )
Nrk   rl   r   )rm   r   r   )rn   nonzero)ro   rv   )r_   r_   <%s(%s, %s)>)r   rp   r
   rM   r(   rq   rr   rs   r]   r`   ra   rQ   )r,   r(   countr   r   r   rc      s    



zRLock.__repr__Nrf   r   r   r   r   r      rt   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,   lockr0   r   r   r   r4      s
   zCondition.__init__c                 C   s   t |  | j| j| j| jfS r   )r	   rC   rz   r{   r|   r}   r9   r   r   r   rG      s   
zCondition.__getstate__c                 C   s    |\| _ | _| _| _|   d S r   )rz   r{   r|   r}   r&   rI   r   r   r   rK      s   
zCondition.__setstate__c                 C   r;   r   )rz   r<   r9   r   r   r   r<      r=   zCondition.__enter__c                 G   r>   r   )rz   r?   r@   r   r   r   r?      rB   zCondition.__exit__c                 C   r6   r   )rz   r7   r8   r9   r   r   r   r&      r:   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 )Nr_   rw   )r{   r   r]   r|   r`   ra   rQ   rz   )r,   num_waitersr   r   r   rc      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)
rz   r   rp   r{   r8   rs   r    r}   r7   r|   )r,   timeoutrx   r2   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   )	rz   r   rp   r}   r7   r|   r{   r8   r    )r,   nressleepersr2   r   r   r   notify  s.   
zCondition.notifyc                 C   s   | j tjd d S )N)r   )r   r   maxsizer9   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 ry   )time	monotonicr   )r,   	predicater   resultendtimewaittimer   r   r   wait_for+  s"   
zCondition.wait_forr   rd   )rQ   rR   rS   r4   rG   rK   r<   r?   r&   rc   r   r   r   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 ry   )r   r   _condr   _flagrj   r   r   r   r4   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   r7   r8   r9   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   r7   r8   r   r9   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   r7   r9   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   r7   r8   r   )r,   r   r   r   r   r   X  s   
	$z
Event.waitr   )rQ   rR   rS   r4   r   r   r   r   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   )BufferWrapperr2   r   )structheapr   calcsizer   rK   _staters   )	r,   partiesactionr   r0   r   r   wrappercondr   r   r   r4   j  s   
zBarrier.__init__c                 C   s.   |\| _ | _| _| _| _| j d| _d S )Nr2   )_parties_action_timeoutr   _wrappercreate_memoryviewcast_arrayrI   r   r   r   rK   s  s   zBarrier.__setstate__c                 C   s   | j | j| j| j| jfS r   )r   r   r   r   r   r9   r   r   r   rG   x  s   zBarrier.__getstate__c                 C   
   | j d S ry   r   r9   r   r   r   r   |     
zBarrier._statec                 C      || j d< d S ry   r   rb   r   r   r   r        c                 C   r   Nr   r   r9   r   r   r   rs     r   zBarrier._countc                 C   r   r   r   rb   r   r   r   rs     r   )NN)
rQ   rR   rS   r4   rK   rG   propertyr   setterrs   r   r   r   r   r   h  s    
	


r   )__all__rq   r   rT   r!   r    r	   r
   r   r   r   ImportErrorlistr    ru   rY   rZ   objectr   r   r   r   r   r   r   r   r   r   r   <module>   s0   	
Mo'