o
    l¨ÊhÖ"  ã                   @   sÀ  d dl Z d dl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 e 	d ¡j
Zejdkr3e 	d¡j
Zd ZdZe e je jB ¡Ze d¡ZG dd„ dejƒZejd	kr–ejed
ƒdd�Zej	ej_ej	gej_ej	gej_ej	gej_ej	gej_ej	ej	gej_ej gej!_ejdkr–ej	e "e¡gej#_zd dlm$Z$ W n e%y«   dd„ Z$Y nw ej&dd… dk rÅG dd„ de'ƒZ(G dd„ de'ƒZ)dd„ Z!d dd„Z*dd„ Z+G dd„ de,ƒZ-dd„ Z.dS )!é    N)Úfind_libraryÚdarwinéÿÿÿÿé   i€  c                   @   s    e Zd ZdejfdejfgZdS )ÚtimespecÚtv_secÚtv_nsecN)Ú__name__Ú
__module__Ú__qualname__ÚctypesÚc_longÚ_fields_© r   r   úW/var/www/html/env/lib/python3.10/site-packages/joblib/externals/loky/backend/semlock.pyr   &   s    r   Úwin32ÚpthreadT)Ú	use_errno)Ú	get_identc                   C   s
   t  ¡ jS ©N)Ú	threadingÚcurrent_threadÚidentr   r   r   r   r   :   ó   
r   é   )é   r   c                   @   ó   e Zd ZdS )ÚFileExistsErrorN©r	   r
   r   r   r   r   r   r   ?   ó    r   c                   @   r   )ÚFileNotFoundErrorNr   r   r   r   r   r    B   r   r    c                 C   s"   t  |  d¡¡dk rtƒ  d S d S )NÚasciir   )r   Ú
sem_unlinkÚencodeÚraiseFromErrno)Únamer   r   r   r"   F   s   
ÿr"   c                 C   s�   |du rt  t | ¡d¡}nt  t | ¡ttt |¡¡}|tkrFt ¡ }|t	j
kr/td|  ƒ‚|t	jkr:td|  ƒ‚|t	jkrCtdƒ‚tƒ  |S )z´ Construct or retrieve a semaphore with the given name

    If value is None, try to retrieve an existing named semaphore.
    Else create a new semaphore with the given value
    Nr   z#a semaphore named %s already existszcannot find semaphore named %sz*No semaphore implementation on this system)r   Úsem_openr   Úc_char_pÚ	SEM_OFLAGÚSEM_PERMÚc_intÚSEM_FAILUREÚ	get_errnoÚerrnoÚEEXISTr   ÚENOENTr    ÚENOSYSÚNotImplementedErrorr$   )r%   ÚvalueÚhandleÚer   r   r   Ú	_sem_openK   s   ÿ


r5   c                 C   s   t   ¡ }tjdkrJt|ƒ}t|ƒ}td||  d ƒ}td||  d ƒ}t|| || ƒ}| jt|jd ƒ7  _| jd;  _t | t	 
|¡¡S || }d}t   ¡ }		 t | ¡}
|
dkr`dS t	 ¡ }|tjkrltƒ  t   ¡ }	|	|kr|t	 tj¡ dS ||	 }t|d|ƒ}t  |¡ |d	7 }qU)
Nr   g    eÍÍAg      à?i Êš;r   Tr   g{®Gáz”?gü©ñÒMbP?)ÚtimeÚsysÚplatformÚintr   r   r   r   Úsem_timedwaitr   ÚpointerÚsem_trywaitr,   r-   ÚEAGAINr$   Ú	set_errnoÚ	ETIMEDOUTÚminÚsleep)r3   ÚtimeoutÚt_startÚsecr   Únsecr   ÚdeadlineÚdelayÚnowÚresr4   Ú
differencer   r   r   Ú_sem_timedwaitf   s:   



érK   c                   @   sp   e Zd ZdZe ¡ Zddd„Zdd„ Zdd	„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdS )ÚSemLockz$ctypes wrapper to the unix semaphoreNFc                 C   s6   d| _ d| _|| _|| _|| _t| j d¡|ƒ| _d S ©Nr   r!   )Úcountr   ÚkindÚmaxvaluer%   r5   r#   r3   )ÚselfrO   r2   rP   r%   Ú
unlink_nowr   r   r   Ú__init__—   s   zSemLock.__init__c                 C   s8   zt  | j¡}|dksJ dƒ‚W d S  ty   Y d S w )Nr   zIssue while closing semaphores)r   Ú	sem_closer3   ÚAttributeError)rQ   rI   r   r   r   Ú__del__Ÿ   s   ÿzSemLock.__del__c                 C   s   | j dko
tƒ | jkS ©Nr   )rN   r   r   ©rQ   r   r   r   Ú_is_mine¦   s   zSemLock._is_mineTc                 C   s¶   | j tkr|  ¡ r|  jd7  _dS |r|d u rt | j¡}n|r%|dkr,t | j¡}nt| j|ƒ}|dk rNt	 
¡ }|tjkrAd S |tjtjfv rKdS tƒ  |  jd7  _tƒ | _dS )Nr   Tr   F)rO   ÚRECURSIVE_MUTEXrY   rN   r   Úsem_waitr3   r<   rK   r   r,   r-   ÚEINTRr=   r?   r$   r   r   )rQ   ÚblockrB   rI   r4   r   r   r   Úacquire©   s$   
zSemLock.acquirec                 C   s  | j tkr#|  ¡ sJ dƒ‚| jdkr|  jd8  _d S | jdks"J ‚nLtjdkrb| jdkrWt | j	¡dk rGt
 ¡ }|tjkrFt|tj| ƒ‚n(t | j	¡dk rStƒ  ntdƒ‚dd l}| dt¡ n|  ¡ }|| jkrotdƒ‚t | j	¡dk rztƒ  |  jd8  _d S )Nz5attempt to release recursive lock not owned by threadr   r   r   z)semaphore or lock released too many timeszEsemaphore are broken on OSX, release might increase its maximal value)rO   rZ   rY   rN   r7   r8   rP   r   r<   r3   r   r,   r-   r=   ÚOSErrorÚ	errorcodeÚsem_postr$   Ú
ValueErrorÚwarningsÚwarnÚRuntimeWarningÚ
_get_value)rQ   r4   rc   r2   r   r   r   Úrelease¿   s@   

ÿ



ÿÿÿ
ÿzSemLock.releasec                 C   s0   t  t  d¡¡}t | j|¡dk rtƒ  |jjS )Nr   r   )	r   r;   r*   r   Úsem_getvaluer3   r$   Úcontentsr2   )rQ   r2   r   r   r   rf   å   s   zSemLock._get_valuec                 C   s   | j S r   ©rN   rX   r   r   r   Ú_countë   s   zSemLock._countc                 C   sŽ   t jdkr-t | j¡dk r t ¡ }|tjkrdS t	|tj
| ƒ‚t | j¡dk r+tƒ  dS t t d¡¡}t | j|¡dk rAtƒ  |jjdkS )Nr   r   TFr   )r7   r8   r   r<   r3   r   r,   r-   r=   r_   r`   ra   r$   r;   r*   rh   ri   r2   )rQ   r4   r2   r   r   r   Ú_is_zeroî   s   

zSemLock._is_zeroc                 C   s
   d| _ d S rW   rj   rX   r   r   r   Ú_after_fork  r   zSemLock._after_forkc                 C   s<   t  t ¡}d|_d|_||_||_||_t| d¡ƒ|_	|S rM   )
rL   Ú__new__rN   r   rO   rP   r%   r5   r#   r3   )r3   rO   rP   r%   rQ   r   r   r   Ú_rebuild  s   
zSemLock._rebuild)NF)TN)r	   r
   r   Ú__doc__ÚtempfileÚ_RandomNameSequenceÚ_randrS   rV   rY   r^   rg   rf   rk   rl   rm   Ústaticmethodro   r   r   r   r   rL   ’   s    

&rL   c                  C   s   t  ¡ } t| tj|  ƒ‚r   )r   r,   r_   r-   r`   )r4   r   r   r   r$     s   r$   r   )/Úosr7   r6   r-   r   rq   r   Úctypes.utilr   Úc_void_pr2   r+   r8   rZ   Ú	SEMAPHOREr*   ÚO_CREATÚO_EXCLr(   r)   Ú	Structurer   ÚCDLLr   r&   ÚrestyperT   Úargtypesr[   r<   ra   rh   r'   r"   ÚPOINTERr:   r   ÚImportErrorÚversion_infor_   r   r    r5   rK   ÚobjectrL   r$   r   r   r   r   Ú<module>   sT   




ÿÿ
,~