U
    .e2                     @   s~  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 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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ZG dd dZeedrlG dd dej Z nG dd dZ dS )    N   )context)process)util)	_billiardensure_SemLock)	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-39f38r4u/billiard/synchronize.py_semname4   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   ranger   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,   r6   r   )r   r6   r   r   r   r-   h   s    zSemLock._cleanupc                 C   s   | j j| _| j j| _d S r   )r   acquirereleaser.   r   r   r   r+   n   s    
zSemLock._make_methodsc                 C   s
   | j  S r   )r   	__enter__r9   r   r   r   r:   r   s    zSemLock.__enter__c                 G   s   | j j| S r   )r   __exit__r.   argsr   r   r   r;   u   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*   r/   r1   r   r   )r.   r   hstater   r   r   __getstate__x   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.   r@   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_RandomNameSequencerG   r5   staticmethodr-   r+   r:   r;   rA   rC   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r2   )r   r5   	SEMAPHORESEM_VALUE_MAXr.   r0   r2   r   r   r   r5      s    zSemaphore.__init__c                 C   s
   | j  S r   )r   
_get_valuer9   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   rS   	Exception	__class__rH   r.   r0   r   r   r   __repr__   s
    
zSemaphore.__repr__)r   N)rH   rI   rJ   r5   rT   rY   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 rN   r   r5   rP   rR   r   r   r   r5      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 )NrU   z<%s(value=%s, maxvalue=%s)>)r   rS   rV   rW   rH   r1   rX   r   r   r   rY      s    
  zBoundedSemaphore.__repr__)r   N)rH   rI   rJ   r5   rY   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   rO   rZ   r.   r2   r   r   r   r5      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SomeOtherProcessrU   z<%s(owner=%s)>)r   _is_miner   rD   r   	threadingcurrent_threadrS   _countrV   rW   rH   )r.   r   r   r   r   rY      s    


zLock.__repr__)NrH   rI   rJ   __doc__r5   rY   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   r5   RECURSIVE_MUTEXr\   r   r   r   r5      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   )r`   nonzero)ra   ri   )rU   rU   <%s(%s, %s)>)r   rb   r   rD   r   rc   rd   re   rS   rV   rW   rH   )r.   r   countr   r   r   rY      s    



zRLock.__repr__)Nrf   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.   lockr2   r   r   r   r5      s    zCondition.__init__c                 C   s   t |  | j| j| j| jfS r   )r   r>   rn   ro   rp   rq   r9   r   r   r   rA      s
    
 zCondition.__getstate__c                 C   s    |\| _ | _| _| _|   d S r   )rn   ro   rp   rq   r+   rB   r   r   r   rC      s
    
 zCondition.__setstate__c                 C   s
   | j  S r   )rn   r:   r9   r   r   r   r:      s    zCondition.__enter__c                 G   s   | j j| S r   )rn   r;   r<   r   r   r   r;      s    zCondition.__exit__c                 C   s   | j j| _| j j| _d S r   )rn   r7   r8   r9   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 )NrU   rj   )ro   r   rS   rp   rV   rW   rH   rn   )r.   Znum_waitersr   r   r   rY     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)rn   r   rb   rm   ro   r8   re   r#   rp   r7   rq   )r.   timeoutrk   r3   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)	rn   r   rb   rm   rq   r7   rp   ro   r8   )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 )Nru   Fr   r   )
rn   r   rb   rm   rq   r7   rp   ro   r8   r#   )r.   rv   Zsleepersr3   r   r   r   
notify_all4  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 rl   )r   rt   )r.   	predicaters   resultendtimewaittimer   r   r   wait_forK  s    

zCondition.wait_for)NN)N)N)rH   rI   rJ   rg   r5   rA   rC   r:   r;   r+   rY   rt   rw   rx   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 rl   )rm   r   r	   _condr   _flagr\   r   r   r   r5   `  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   r7   r8   r9   r   r   r   is_sete  s
    
zEvent.is_setc              	   C   s6   | j & | jd | j  | j   W 5 Q R X d S NF)r~   r   r7   r8   rx   r9   r   r   r   setl  s    
z	Event.setc              	   C   s"   | j  | jd W 5 Q R X d S r   )r~   r   r7   r9   r   r   r   clearr  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   r7   r8   rt   )r.   rs   r   r   r   rt   v  s    
z
Event.wait)N)N)rH   rI   rJ   r5   r   r   r   rt   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   )BufferWrapperr3   r   )	rm   structheapr   calcsizer   rC   _statere   )	r.   partiesactionrs   r2   r   r   wrapperZcondr   r   r   r5     s    Barrier.__init__c                 C   s.   |\| _ | _| _| _| _| j d| _d S )Nr3   )_parties_action_timeoutr~   _wrapperZcreate_memoryviewcast_arrayrB   r   r   r   rC     s
     zBarrier.__setstate__c                 C   s   | j | j| j| j| jfS r   )r   r   r   r~   r   r9   r   r   r   rA     s     zBarrier.__getstate__c                 C   s
   | j d S rl   r   r9   r   r   r   r     s    zBarrier._statec                 C   s   || j d< d S rl   r   rX   r   r   r   r     s    c                 C   s
   | j d S Nr   r   r9   r   r   r   re     s    zBarrier._countc                 C   s   || j d< d S r   r   rX   r   r   r   re     s    )NNN)
rH   rI   rJ   r5   rC   rA   propertyr   setterre   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   r5     s    r   N)rH   rI   rJ   r5   r   r   r   r   r     s   )!r   r!   rK   rc    r   r   r   Z_extr   r   timer   __all__listr#   rh   rP   r   rQ   r   r   _multiprocessingImportErrorr   r   r   r	   r
   r   r   hasattrr   r   r   r   r   <module>
   sH        V|)(