U
    ºmœdø-  ã                   @   s(  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m	Z	 d dl
mZ ddlmZ ddd	d
ddgZzd dlmZ d dlmZ W n ek
r¤   edƒ‚Y nX edƒ\ZZejj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dS )é    N)Útime)ÚprocessÚutil)Úassert_spawningé   )Úresource_trackerÚLockÚRLockÚ	SemaphoreÚBoundedSemaphoreÚ	ConditionÚEvent)Ú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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   Nc              	   C   sØ   d}|d krXt dƒD ]8}zt|||t ¡ |ƒ| _W n tk
rF   Y qX  qjqtdƒ‚nt|||||ƒ| _|| _t d| jj	› d| j› d�¡ |  
¡  dd„ }t | |¡ t | jjd	¡ tj| tj| jjfd
d� d S )NFéd   zcannot find name for semaphorezcreated semlock with handle ú and name "ú"c                 S   s   | j  ¡  d S ©N)Ú_semlockÚ_after_fork)Úobj© r   úb/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/joblib/externals/loky/backend/synchronize.pyr   [   s    z%SemLock.__init__.<locals>._after_forkÚsemlockr   )Zexitpriority)ÚrangeÚ_SemLockr   Ú
_make_namer   ÚFileExistsErrorÚnamer   ÚdebugÚhandleÚ_make_methodsZregister_after_forkr   ÚregisterZFinalizeÚ_cleanup)ÚselfÚkindÚvalueÚmaxvaluer   Z
unlink_nowÚ_r   r   r   r   Ú__init__A   s<        ÿ

ÿ   ÿzSemLock.__init__c              
   C   s:   z&zt| ƒ W n tk
r"   Y nX W 5 t  | d¡ X d S )Nr   )r   Ú
unregisterr   ÚFileNotFoundError)r   r   r   r   r$   g   s
    
zSemLock._cleanupc                 C   s   | j j| _| j j| _d S r   )r   ÚacquireÚrelease©r%   r   r   r   r"   r   s    
zSemLock._make_methodsc                 C   s
   | j  ¡ S r   )r   r-   r/   r   r   r   Ú	__enter__v   s    zSemLock.__enter__c                 G   s
   | j  ¡ S r   )r   r.   ©r%   Úargsr   r   r   Ú__exit__y   s    zSemLock.__exit__c                 C   s&   t | ƒ | j}|j}||j|j|jfS r   )r   r   r!   r&   r(   r   )r%   ÚslÚhr   r   r   Ú__getstate__|   s    zSemLock.__getstate__c                 C   s8   t j|Ž | _t d|d ›d|d › d�¡ |  ¡  d S )Nzrecreated blocker with handle r   r   é   r   )r   Z_rebuildr   r   r    r"   ©r%   Ústater   r   r   Ú__setstate__‚   s
    ÿzSemLock.__setstate__c                   C   s   dt  ¡ › dttjƒ› �S )Nz/loky-ú-)ÚosÚgetpidÚnextr   Ú_randr   r   r   r   r   ‰   s    zSemLock._make_name)N)Ú__name__Ú
__module__Ú__qualname__ÚtempfileÚ_RandomNameSequencer?   r*   Ústaticmethodr$   r"   r0   r3   r6   r:   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  | t|t¡ d S r   )r   r*   Ú	SEMAPHOREÚSEM_VALUE_MAX©r%   r'   r   r   r   r*   •   s    zSemaphore.__init__c                 C   s   t jdkrtdƒ‚| j ¡ S )NÚdarwinz#OSX does not implement sem_getvalue)ÚsysÚplatformÚNotImplementedErrorr   Ú
_get_valuer/   r   r   r   Ú	get_value˜   s    
zSemaphore.get_valuec                 C   s>   z| j  ¡ }W n tk
r&   d}Y nX d| jj› d|› d�S )NÚunknownú<ú(value=ú)>)r   rM   Ú	ExceptionÚ	__class__r@   rH   r   r   r   Ú__repr__�   s
    
zSemaphore.__repr__N)r   )r@   rA   rB   r*   rN   rU   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  | t||¡ d S r   )r   r*   rF   rH   r   r   r   r*   «   s    zBoundedSemaphore.__init__c                 C   sH   z| j  ¡ }W n tk
r&   d}Y nX d| jj› d|› d| j j› d�S )NrO   rP   rQ   z, maxvalue=rR   )r   rM   rS   rT   r@   r(   rH   r   r   r   rU   ®   s    
ÿzBoundedSemaphore.__repr__N)r   )r@   rA   rB   r*   rU   r   r   r   r   r   ª   s   
c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r   c                    s   t ƒ  tdd¡ d S ©Nr   )Úsuperr*   rF   r/   ©rT   r   r   r*   ¿   s    zLock.__init__c                 C   s˜   zh| j  ¡ r:t ¡ j}t ¡ jdkrf|› dt ¡ j› �}n,| j  ¡ dkrNd}n| j  ¡ dkrbd}nd}W n t	k
r€   d}Y nX d	| j
j› d
|› d�S )NÚ
MainThreadú|r   ÚNoner   ÚSomeOtherThreadÚSomeOtherProcessrO   rP   z(owner=rR   )r   Ú_is_miner   Úcurrent_processr   Ú	threadingÚcurrent_threadrM   Ú_countrS   rT   r@   )r%   r   r   r   r   rU   Â   s    


zLock.__repr__©r@   rA   rB   r*   rU   Ú__classcell__r   r   rX   r   r   ¾   s   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r	   c                    s   t ƒ  tdd¡ d S rV   )rW   r*   ÚRECURSIVE_MUTEXr/   rX   r   r   r*   Ù   s    zRLock.__init__c                 C   s¸   z~| j  ¡ rDt ¡ j}t ¡ jdkr8|› dt ¡ j› �}| j  ¡ }n8| j  ¡ dkr\d\}}n | j  ¡ dkrtd\}}nd\}}W n t	k
rš   d\}}Y nX d	| j
j› d
|› d|› d�S )NrY   rZ   r   )r[   r   r   )r\   Únonzero)r]   rf   )rO   rO   rP   ú(ú, rR   )r   r^   r   r_   r   r`   ra   rb   rM   rS   rT   r@   )r%   r   Úcountr   r   r   rU   Ü   s    



zRLock.__repr__rc   r   r   rX   r   r	   Ø   s   c                   @   sj   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„ Zdd„ Zddd„ZdS )r   Nc                 C   s6   |pt ƒ | _tdƒ| _tdƒ| _tdƒ| _|  ¡  d S ©Nr   )r	   Ú_lockr
   Ú_sleeping_countÚ_woken_countÚ_wait_semaphorer"   )r%   Úlockr   r   r   r*   ô   s
    


zCondition.__init__c                 C   s   t | ƒ | j| j| j| jfS r   )r   rk   rl   rm   rn   r/   r   r   r   r6   û   s    üzCondition.__getstate__c                 C   s    |\| _ | _| _| _|  ¡  d S r   )rk   rl   rm   rn   r"   r8   r   r   r   r:     s    ûzCondition.__setstate__c                 C   s
   | j  ¡ S r   )rk   r0   r/   r   r   r   r0     s    zCondition.__enter__c                 G   s   | j j|Ž S r   )rk   r3   r1   r   r   r   r3     s    zCondition.__exit__c                 C   s   | j j| _| j j| _d S r   )rk   r-   r.   r/   r   r   r   r"     s    
zCondition._make_methodsc                 C   sT   z| j j ¡ | jj ¡  }W n tk
r4   d}Y nX d| jj› d| j› d|› d�S )NrO   rP   rg   rh   rR   )rl   r   rM   rm   rS   rT   r@   rk   )r%   Znum_waitersr   r   r   rU     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)rk   r   r^   ÚAssertionErrorrl   r.   rb   r   rm   r-   rn   )r%   Útimeoutri   r)   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)	rk   r   r^   rp   rn   r-   rm   rl   r.   )r%   Úresr   r   r   Únotify9  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|r”t	|ƒD ]}| j ¡  qv| j d¡r”q†d S )Nrs   Fr   r   )
rk   r   r^   rp   rn   r-   rm   rl   r.   r   )r%   rt   Zsleepersr)   r   r   r   Ú
notify_allJ  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 rj   )Ú_timerr   )r%   Ú	predicaterq   ÚresultÚendtimeÚwaittimer   r   r   Úwait_fora  s    

zCondition.wait_for)N)N)N)r@   rA   rB   r*   r6   r:   r0   r3   r"   rU   rr   ru   rv   r|   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   t tƒ ƒ| _tdƒ| _d S rj   )r   r   Ú_condr
   Ú_flagr/   r   r   r   r*   z  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~   r-   r.   r/   r   r   r   Úis_set~  s
    
zEvent.is_setc              	   C   s6   | j �& | j d¡ | j ¡  | j  ¡  W 5 Q R X d S ©NF)r}   r~   r-   r.   rv   r/   r   r   r   Úset…  s    
z	Event.setc              	   C   s"   | j � | j d¡ W 5 Q R X d S r�   )r}   r~   r-   r/   r   r   r   Úclear‹  s    zEvent.clearNc              	   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~   r-   r.   rr   )r%   rq   r   r   r   rr   �  s    
z
Event.wait)N)r@   rA   rB   r*   r€   r‚   rƒ   rr   r   r   r   r   r   y  s
   )r<   rJ   rC   r`   Ú_multiprocessingr   rw   Úmultiprocessingr   r   Zmultiprocessing.contextr   Ú r   Ú__all__r   r   r   ÚImportErrorr   re   rF   rG   r
   r   r   r	   r   r   r   r   r   r   Ú<module>   s@   úÿ
W 