B
    2*™\Ë.  ã               @   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	 y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}xPtdƒD ]<}y t ||||  	¡ |¡ }| _
W n tk
rn   Y q6X P q6W tdƒ‚t d|j ¡ |  ¡  tjdkr´dd„ }	t | |	¡ | j
jd k	ròdd	lm}
 |
| j
jƒ tj| tj| j
jfd
d d S )NÚwin32Zforkéd   zcannot find name for semaphorezcreated semlock with handle %sc             S   s   | j  ¡  d S )N)Ú_semlockÚ_after_fork)Úobj© r   úFC:\ALexclude\prg\programme\Python37\Lib\multiprocessing\synchronize.pyr   G   s    z%SemLock.__init__.<locals>._after_forkr   )Úregisterr   )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Úsemaphore_trackerr   ZFinalizeÚ_cleanup)ÚselfÚkindÚvalueÚmaxvalueÚctxr    Z
unlink_nowÚiÚslr   r   r   r   r   Ú__init__2   s.    

zSemLock.__init__c             C   s    ddl m} t| ƒ || ƒ d S )Nr   )Ú
unregister)r!   r+   r   )r    r+   r   r   r   r"   T   s    zSemLock._cleanupc             C   s   | j j| _| j j| _d S )N)r   ÚacquireÚrelease)r#   r   r   r   r   Z   s    
zSemLock._make_methodsc             C   s
   | j  ¡ S )N)r   Ú	__enter__)r#   r   r   r   r.   ^   s    zSemLock.__enter__c             G   s   | j j|Ž S )N)r   Ú__exit__)r#   Úargsr   r   r   r/   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_RandomNameSequencer8   r*   Ústaticmethodr"   r   r.   r/   r3   r5   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 )N)r   Ú
_get_value)r#   r   r   r   Ú	get_value€   s    zSemaphore.get_valuec             C   s8   y| j  ¡ }W n tk
r&   d}Y nX d| jj|f S )NÚunknownz<%s(value=%s)>)r   r@   Ú	ExceptionÚ	__class__r9   )r#   r%   r   r   r   Ú__repr__ƒ   s
    
zSemaphore.__repr__N)r   )r9   r:   r;   r*   rA   rE   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 )N)r'   )r   r*   r>   )r#   r%   r'   r   r   r   r*      s    zBoundedSemaphore.__init__c             C   s>   y| j  ¡ }W n tk
r&   d}Y nX d| jj|| j jf S )NrB   z<%s(value=%s, maxvalue=%s)>)r   r@   rC   rD   r9   r&   )r#   r%   r   r   r   rE   “   s    
zBoundedSemaphore.__repr__N)r   )r9   r:   r;   r*   rE   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   )r'   )r   r*   r>   )r#   r'   r   r   r   r*   ¡   s    zLock.__init__c             C   s   yf| 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ÚSomeOtherProcessrB   z<%s(owner=%s)>)r   Ú_is_miner
   r6   r    Ú	threadingÚcurrent_threadr@   Ú_countrC   rD   r9   )r#   r    r   r   r   rE   ¤   s    


zLock.__repr__N)r9   r:   r;   r*   rE   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   )r'   )r   r*   ÚRECURSIVE_MUTEX)r#   r'   r   r   r   r*   º   s    zRLock.__init__c             C   s¬   y|| 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 )
NrF   rG   r   )rH   r   r   )rI   Únonzero)rJ   rP   )rB   rB   z<%s(%s, %s)>)r   rK   r
   r6   r    rL   rM   rN   r@   rC   rD   r9   )r#   r    Úcountr   r   r   rE   ½   s    



zRLock.__repr__N)r9   r:   r;   r*   rE   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 )N)r	   r1   rR   rS   rT   rU   )r#   r   r   r   r3   Û   s    
zCondition.__getstate__c             C   s    |\| _ | _| _| _|  ¡  d S )N)rR   rS   rT   rU   r   )r#   r4   r   r   r   r5   à   s    zCondition.__setstate__c             C   s
   | j  ¡ S )N)rR   r.   )r#   r   r   r   r.   å   s    zCondition.__enter__c             G   s   | j j|Ž S )N)rR   r/   )r#   r0   r   r   r   r/   è   s    zCondition.__exit__c             C   s   | j j| _| j j| _d S )N)rR   r,   r-   )r#   r   r   r   r   ë   s    
zCondition._make_methodsc             C   sJ   y| j j ¡ | jj ¡  }W n tk
r4   d}Y nX d| jj| j|f S )NrB   z<%s(%s, %s)>)rS   r   r@   rT   rC   rD   r9   rR   )r#   Znum_waitersr   r   r   rE   ï   s    

zCondition.__repr__c          	   C   s‚   | j j ¡ stdƒ‚| j ¡  | j j ¡ }xt|ƒD ]}| j  ¡  q4W z| j 	d|¡S | j
 ¡  xt|ƒD ]}| j  	¡  qjW X d S )Nz,must acquire() condition before using wait()T)rR   r   rK   ÚAssertionErrorrS   r-   rN   r   rU   r,   rT   )r#   ÚtimeoutrQ   r(   r   r   r   Úwait÷   s    

zCondition.waitr   c             C   s¸   | j j ¡ stdƒ‚| j d¡r(tdƒ‚x(| j d¡rP| j d¡}|s*tdƒ‚q*W d}x*||k r€| j d¡r€| j ¡  |d7 }qXW |r´xt	|ƒD ]}| j ¡  qW x| j d¡r²q¤W 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   )
rR   r   rK   rW   rU   r,   rT   rS   r-   r   )r#   ÚnÚresZsleepersr(   r   r   r   Únotify  s    
zCondition.notifyc             C   s   | j tjd d S )N)rZ   )r\   r   Úmaxsize)r#   r   r   r   Ú
notify_all(  s    zCondition.notify_allc             C   sh   |ƒ }|r|S |d k	r$t  ¡ | }nd }d }x6|sb|d k	rP|t  ¡  }|dkrPP |  |¡ |ƒ }q.W |S )Nr   )ÚtimeZ	monotonicrY   )r#   Z	predicaterX   ÚresultZendtimeZwaittimer   r   r   Úwait_for+  s    

zCondition.wait_for)N)N)r   )N)r9   r:   r;   r*   r3   r5   r.   r/   r   rE   rY   r\   r^   ra   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 )Nr   )r   r   Ú_condr   Ú_flag)r#   r'   r   r   r   r*   C  s    zEvent.__init__c          	   C   s0   | j   | j d¡r"| j ¡  dS dS Q R X d S )NFT)rb   rc   r,   r-   )r#   r   r   r   Úis_setG  s
    
zEvent.is_setc          	   C   s6   | j & | j d¡ | j ¡  | j  ¡  W d Q R X d S )NF)rb   rc   r,   r-   r^   )r#   r   r   r   ÚsetN  s    
z	Event.setc          	   C   s"   | j  | j d¡ W d Q R X d S )NF)rb   rc   r,   )r#   r   r   r   ÚclearT  s    zEvent.clearNc          	   C   sT   | j D | j d¡r | j ¡  n| j  |¡ | j d¡rF| j ¡  dS dS Q R X d S )NFT)rb   rc   r,   r-   rY   )r#   rX   r   r   r   rY   X  s    
z
Event.wait)N)r9   r:   r;   r*   rd   re   rf   rY   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Úheaprh   Úcalcsizer   r5   Ú_staterN   )	r#   ZpartiesÚactionrX   r'   ri   rh   ÚwrapperZcondr   r   r   r*   j  s    zBarrier.__init__c             C   s.   |\| _ | _| _| _| _| j ¡  d¡| _d S )Nr(   )Ú_partiesÚ_actionÚ_timeoutrb   Ú_wrapperZcreate_memoryviewÚcastÚ_array)r#   r4   r   r   r   r5   s  s    zBarrier.__setstate__c             C   s   | j | j| j| j| jfS )N)ro   rp   rq   rb   rr   )r#   r   r   r   r3   x  s    zBarrier.__getstate__c             C   s
   | j d S )Nr   )rt   )r#   r   r   r   rl   |  s    zBarrier._statec             C   s   || j d< d S )Nr   )rt   )r#   r%   r   r   r   rl   €  s    c             C   s
   | j d S )Nr   )rt   )r#   r   r   r   rN   „  s    zBarrier._countc             C   s   || j d< d S )Nr   )rt   )r#   r%   r   r   r   rN   ˆ  s    )NN)
r9   r:   r;   r*   r5   r3   Úpropertyrl   ÚsetterrN   r   r   r   r   rg   h  s   
	rg   )Ú__all__rL   r   r<   r   r_   Ú r	   r
   r   r   r   ÚImportErrorÚlistr   rO   r>   r?   Úobjectr   r   r   r   r   r   rg   r   r   r   r   Ú<module>   s.   Mo'