U
    d2                     @   s  d dl m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	 ddl
mZmZ ddlmZmZ d	d
ddddgZe  eed\ZZejjZzejjZW n> ek
r   zd dlmZ W n ek
r   dZY nX Y nX dd 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!e"edrG dd dej#Z#nG dd deZ#dS )    )absolute_importN   )context)process)util)	_billiardensure_SemLock)range	monotonicLockRLock	SemaphoreBoundedSemaphore	ConditionEvent   )
sem_unlinkc                 C   s"   z| j W S  tk
r   Y nX d S N)nameAttributeError)sl r   8/tmp/pip-unpacked-wheel-lulkwrw3/billiard/synchronize.py_semname5   s    r   c                   @   s^   e Zd Ze Zd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 )SemLockNc                 C   sJ  |d krt j }| }tjdkp*|dk}trtdD ]d}z t	|||| 
 | }| _W n: ttfk
r }	 zt|	dd tjkr W 5 d }	~	X Y q8X  qq8td}	tj|	_|	nt	||| }| _td|j |   trFtjdkrdd }
t| |
 t| jd k	rFd	d
lm} || jj tj| t	j| jjfdd d S )Nwin32forkd   errnozcannot find file for semaphorezcreated semlock with handle %sc                 S   s   | j   d S r   )_semlock_after_fork)objr   r   r   r    \   s    z%SemLock.__init__.<locals>._after_forkr   )registerr   )Zexitpriority)r   Z_default_contextZget_contextZget_start_methodsysplatformr   r	   r   r   
_make_namer   OSErrorIOErrorgetattrr   EEXISTr   debughandle_make_methodsZregister_after_forkr   semaphore_trackerr"   r   ZFinalize_cleanup)selfkindvaluemaxvaluectxr   Z
unlink_nowir   excr    r"   r   r   r   __init__?   sD    
    zSemLock.__init__c                 C   s    ddl m} t|  ||  d S )Nr   )
unregister)r-   r7   r   )r   r7   r   r   r   r.   i   s    zSemLock._cleanupc                 C   s   | j j| _| j j| _d S r   )r   acquirereleaser/   r   r   r   r,   o   s    
zSemLock._make_methodsc                 C   s
   | j  S r   )r   	__enter__r:   r   r   r   r;   s   s    zSemLock.__enter__c                 G   s   | j j| S r   )r   __exit__r/   argsr   r   r   r<   v   s    zSemLock.__exit__c                 C   sj   t |  | j}tjdkr,t  |j}n|j}||j|j	f}z||j
f7 }W n tk
rd   Y nX |S )Nr   )r   assert_spawningr   r#   r$   Zget_spawning_popenZduplicate_for_childr+   r0   r2   r   r   )r/   r   hstater   r   r   __getstate__y   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/   rA   r   r   r   __setstate__   s    zSemLock.__setstate__c                   C   s   dt  jd ttjf S )Nz%s-%sZ	semprefix)r   current_process_confignextr   _randr   r   r   r   r%      s    zSemLock._make_name)N)__name__
__module____qualname__tempfile_RandomNameSequencerH   r6   staticmethodr.   r,   r;   r<   rB   rD   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   Nc                 C   s   t j| t|t|d d S Nr3   )r   r6   	SEMAPHORESEM_VALUE_MAXr/   r1   r3   r   r   r   r6      s    zSemaphore.__init__c                 C   s
   | j  S r   )r   
_get_valuer:   r   r   r   	get_value   s    zSemaphore.get_valuec                 C   s8   z| j  }W n tk
r&   d}Y nX d| jj|f S )Nunknownz<%s(value=%s)>)r   rT   	Exception	__class__rI   r/   r1   r   r   r   __repr__   s
    
zSemaphore.__repr__)r   N)rI   rJ   rK   r6   rU   rZ   r   r   r   r   r      s   
c                   @   s   e Zd ZdddZdd ZdS )r   r   Nc                 C   s   t j| t|||d d S rO   r   r6   rQ   rS   r   r   r   r6      s    zBoundedSemaphore.__init__c                 C   s>   z| j  }W n tk
r&   d}Y nX d| jj|| j jf S )NrV   z<%s(value=%s, maxvalue=%s)>)r   rT   rW   rX   rI   r2   rY   r   r   r   rZ      s    
  zBoundedSemaphore.__repr__)r   N)rI   rJ   rK   r6   rZ   r   r   r   r   r      s   
c                   @   s"   e Zd ZdZdddZdd ZdS )r   z
    Non-recursive lock.
    Nc                 C   s   t j| tdd|d d S Nr   rP   r[   r/   r3   r   r   r   r6      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	k
r~   d}Y nX d	| j
j|f S )
N
MainThread|r   Noner   SomeOtherThreadSomeOtherProcessrV   z<%s(owner=%s)>)r   _is_miner   rE   r   	threadingcurrent_threadrT   _countrW   rX   rI   )r/   r   r   r   r   rZ      s    


zLock.__repr__)NrI   rJ   rK   __doc__r6   rZ   r   r   r   r   r      s   
c                   @   s"   e Zd ZdZdddZdd ZdS )r   z
    Recursive lock
    Nc                 C   s   t j| tdd|d d S r\   )r   r6   RECURSIVE_MUTEXr]   r   r   r   r6      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	k
r   d\}}Y nX d	| j
j||f S )
Nr^   r_   r   )r`   r   r   )ra   nonzero)rb   rj   )rV   rV   <%s(%s, %s)>)r   rc   r   rE   r   rd   re   rf   rT   rW   rX   rI   )r/   r   countr   r   r   rZ      s    



zRLock.__repr__)Nrg   r   r   r   r   r      s   
c                   @   sn   e Zd 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 Zdd ZdddZdS )r   z
    Condition variable
    Nc                 C   sF   |st |p| | _|d| _|d| _|d| _|   d S Nr   )AssertionErrorr   _lockr   _sleeping_count_woken_count_wait_semaphorer,   )r/   lockr3   r   r   r   r6      s    zCondition.__init__c                 C   s   t |  | j| j| j| jfS r   )r   r?   ro   rp   rq   rr   r:   r   r   r   rB      s
    
 zCondition.__getstate__c                 C   s    |\| _ | _| _| _|   d S r   )ro   rp   rq   rr   r,   rC   r   r   r   rD      s
    
 zCondition.__setstate__c                 C   s
   | j  S r   )ro   r;   r:   r   r   r   r;      s    zCondition.__enter__c                 G   s   | j j| S r   )ro   r<   r=   r   r   r   r<      s    zCondition.__exit__c                 C   s   | j j| _| j j| _d S r   )ro   r8   r9   r:   r   r   r   r,      s    
zCondition._make_methodsc                 C   sJ   z| j j | jj  }W n tk
r4   d}Y nX d| jj| j|f S )NrV   rk   )rp   r   rT   rq   rW   rX   rI   ro   )r/   Znum_waitersr   r   r   rZ     s    


  zCondition.__repr__c              	   C   s~   | j j std| j  | j j }t|D ]}| j   q2z| j
	d|W S | j  t|D ]}| j 	  qhX d S )Nz,must acquire() condition before using wait()T)ro   r   rc   rn   rp   r9   rf   r	   rq   r8   rr   )r/   timeoutrl   r4   r   r   r   wait  s    

zCondition.waitc                 C   sv   | j j std| jdr$t| jdrF| jd}|s$tq$| jdrr| j  | j  | jd d S )Nlock is not ownedF)	ro   r   rc   rn   rr   r8   rq   rp   r9   )r/   resr   r   r   notify$  s    


zCondition.notifyc                 C   s   | j j std| jdr$t| jdrF| jd}|s$tq$d}| jdrj| j  |d7 }qJ|rt	|D ]}| j  qv| jdrqd S )Nrv   Fr   r   )
ro   r   rc   rn   rr   r8   rq   rp   r9   r	   )r/   rw   Zsleepersr4   r   r   r   
notify_all5  s    


zCondition.notify_allc                 C   s`   | }|r|S |d k	r"t  | }nd }d }|s\|d k	rJ|t   }|dkrJq\| | | }q*|S rm   )r
   ru   )r/   	predicatert   resultendtimewaittimer   r   r   wait_forL  s    

zCondition.wait_for)NN)N)N)rI   rJ   rK   rh   r6   rB   rD   r;   r<   r,   rZ   ru   rx   ry   r~   r   r   r   r   r      s   
	
c                   @   s8   e Zd ZdddZdd Zdd Zdd	 Zdd
dZdS )r   Nc                 C   s(   |st || | _|d| _d S rm   )rn   r   r   _condr   _flagr]   r   r   r   r6   a  s    zEvent.__init__c              	   C   sD   | j 4 | jdr,| j  W 5 Q R  dS W 5 Q R  dS Q R X d S NFT)r   r   r8   r9   r:   r   r   r   is_setf  s
    
zEvent.is_setc              	   C   s6   | j & | jd | j  | j   W 5 Q R X d S NF)r   r   r8   r9   ry   r:   r   r   r   setm  s    
z	Event.setc              	   C   s"   | j  | jd W 5 Q R X d S r   )r   r   r8   r:   r   r   r   clears  s    zEvent.clearc              	   C   sh   | j X | jdr | j  n| j | | jdrP| j  W 5 Q R  dS W 5 Q R  dS Q R X d S r   )r   r   r8   r9   ru   )r/   rt   r   r   r   ru   w  s    
z
Event.wait)N)N)rI   rJ   rK   r6   r   r   r   ru   r   r   r   r   r   _  s
   
Barrierc                   @   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 )r   Nc           	      C   sZ   |st dd l}ddlm} ||dd }| }| |||||f d| _d| _d S )Nr   r   )BufferWrapperr4   r   )	rn   structheapr   calcsizer   rD   _staterf   )	r/   partiesactionrt   r3   r   r   wrapperZcondr   r   r   r6     s    Barrier.__init__c                 C   s.   |\| _ | _| _| _| _| j d| _d S )Nr4   )_parties_action_timeoutr   _wrapperZcreate_memoryviewcast_arrayrC   r   r   r   rD     s
     zBarrier.__setstate__c                 C   s   | j | j| j| j| jfS r   )r   r   r   r   r   r:   r   r   r   rB     s     zBarrier.__getstate__c                 C   s
   | j d S rm   r   r:   r   r   r   r     s    zBarrier._statec                 C   s   || j d< d S rm   r   rY   r   r   r   r     s    c                 C   s
   | j d S Nr   r   r:   r   r   r   rf     s    zBarrier._countc                 C   s   || j d< d S r   r   rY   r   r   r   rf     s    )NNN)
rI   rJ   rK   r6   rD   rB   propertyr   setterrf   r   r   r   r   r     s   




c                   @   s   e Zd Zdd ZdS )r   c                 O   s   t dd S )NzBarrier only supported on Py3)NotImplementedError)r/   r>   kwargsr   r   r   r6     s    r   N)rI   rJ   rK   r6   r   r   r   r   r     s   )$
__future__r   r   r#   rL   rd    r   r   r   Z_extr   r   Zfiver	   r
   __all__listri   rQ   r   rR   r   r   _multiprocessingImportErrorr   objectr   r   r   r   r   r   hasattrr   r   r   r   r   <module>	   sJ        V|)(