o
    @c.                     @   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   YC:\Users\Chris\AppData\Local\Programs\Python\Python310\lib\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(   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)   r4   r   )r(   r4   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__r8   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,   r2   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-%s	semprefix)r
   current_process_confignextr   _randr   r   r   r   r"   r   s   zSemLock._make_nameN)__name__
__module____qualname__tempfile_RandomNameSequencerN   r3   staticmethodr+   r&   r;   r>   rF   rI   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   r3   	SEMAPHORESEM_VALUE_MAXr,   r.   r0   r   r   r   r3   }      zSemaphore.__init__c                 C   r:   r   )r   
_get_valuer8   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__rO   r,   r.   r   r   r   __repr__   s   zSemaphore.__repr__Nr   )rO   rP   rQ   r3   r\   ra   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 rU   r   r3   rW   rY   r   r   r   r3      rZ   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^   r_   rO   r/   r`   r   r   r   ra      s   zBoundedSemaphore.__repr__Nrb   rO   rP   rQ   r3   ra   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   rV   rc   r,   r0   r   r   r   r3      rZ   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
   rK   r(   	threadingcurrent_threadr[   _countr^   r_   rO   )r,   r(   r   r   r   ra      s    

zLock.__repr__Nrd   r   r   r   r   r          r   c                   @   re   )r   c                C   rf   rg   )r   r3   RECURSIVE_MUTEXrh   r   r   r   r3      rZ   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 )
Nri   rj   r   )rk   r   r   )rl   nonzero)rm   rt   )r]   r]   <%s(%s, %s)>)r   rn   r
   rK   r(   ro   rp   rq   r[   r^   r_   rO   )r,   r(   countr   r   r   ra      s    



zRLock.__repr__Nrd   r   r   r   r   r      rr   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   r3      s
   zCondition.__init__c                 C   s   t |  | j| j| j| jfS r   )r	   rB   rx   ry   rz   r{   r8   r   r   r   rF      s   
zCondition.__getstate__c                 C   s    |\| _ | _| _| _|   d S r   )rx   ry   rz   r{   r&   rG   r   r   r   rI      s   
zCondition.__setstate__c                 C   r:   r   )rx   r;   r8   r   r   r   r;      r<   zCondition.__enter__c                 G   r=   r   )rx   r>   r?   r   r   r   r>      rA   zCondition.__exit__c                 C   r5   r   )rx   r6   r7   r8   r   r   r   r&      r9   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]   ru   )ry   r   r[   rz   r^   r_   rO   rx   )r,   Znum_waitersr   r   r   ra      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)
rx   r   rn   ry   r7   rq   r    r{   r6   rz   )r,   timeoutrv   r1   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   )	rx   r   rn   r{   r6   rz   ry   r7   r    )r,   nresZsleepersr1   r   r   r   notify  s.   
zCondition.notifyc                 C   s   | j tjd d S )N)r   )r   r   maxsizer8   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 rw   )time	monotonicr~   )r,   	predicater}   resultendtimewaittimer   r   r   wait_for+  s"   
zCondition.wait_forr   rb   )rO   rP   rQ   r3   rF   rI   r;   r>   r&   ra   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 rw   )r   r   _condr   _flagrh   r   r   r   r3   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   r6   r7   r8   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   r6   r7   r   r8   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   r6   r8   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   r6   r7   r~   )r,   r}   r   r   r   r~   X  s   
	$z
Event.waitr   )rO   rP   rQ   r3   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   )BufferWrapperr1   r   )structheapr   calcsizer   rI   _staterq   )	r,   partiesactionr}   r0   r   r   wrappercondr   r   r   r3   j  s   
zBarrier.__init__c                 C   s.   |\| _ | _| _| _| _| j d| _d S )Nr1   )_parties_action_timeoutr   _wrappercreate_memoryviewcast_arrayrG   r   r   r   rI   s  s   zBarrier.__setstate__c                 C   s   | j | j| j| j| jfS r   )r   r   r   r   r   r8   r   r   r   rF   x  s   zBarrier.__getstate__c                 C   
   | j d S rw   r   r8   r   r   r   r   |     
zBarrier._statec                 C      || j d< d S rw   r   r`   r   r   r   r        c                 C   r   Nr   r   r8   r   r   r   rq     r   zBarrier._countc                 C   r   r   r   r`   r   r   r   rq     r   )NN)
rO   rP   rQ   r3   rI   rF   propertyr   setterrq   r   r   r   r   r   h  s    
	


r   )__all__ro   r   rR   r!   r    r	   r
   r   r   r   ImportErrorlistr    rs   rW   rX   objectr   r   r   r   r   r   r   r   r   r   r   <module>   s0   	
Mo'