o
    tBh"                     @   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re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re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 rG 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   |/var/www/html/riverr-enterprise-integrations-main/venv/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    eAg      ?i ʚ;r   Tr   g{Gz?gMbP?)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   





,~