o
    l¨Êhu,  ã                   @   sf  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 ddl	m
Z
 d dlmZ d dlmZ g d¢Zz ejd	k rIdd
lmZ ddlmZ nd d
lmZ d dlmZ W n eya   edƒ‚w ejdd… dk rmeZeedƒƒ\ZZejj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"dS )é    N)Útimeé   )Úassert_spawning)Úresource_tracker)Úprocess)Úutil)Ú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.é   )r   r   c                   @   s\   e Zd Ze ¡ Z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   c              	   C   s®   d}t dƒD ]}zt|||t ¡ |ƒ| _W n	 ty   Y qw  ntdƒ‚t d| jj| jj	f ¡ |  
¡  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 %s and name "%s"c                 S   s   | j  ¡  d S ©N)Ú_semlockÚ_after_fork)Úobj© r   ú[/var/www/html/env/lib/python3.10/site-packages/joblib/externals/loky/backend/synchronize.pyr   S   s   z%SemLock.__init__.<locals>._after_forkÚsemlockr   )Úexitpriority)ÚrangeÚ_SemLockr   Ú
_make_namer   ÚFileExistsErrorr   ÚdebugÚhandleÚnameÚ_make_methodsÚregister_after_forkr   ÚregisterÚFinalizeÚ_cleanup)ÚselfÚkindÚvalueÚmaxvalueÚ
unlink_nowÚir   r   r   r   Ú__init__?   s,   
þÿÿ
ÿzSemLock.__init__c                 C   s   t | ƒ t | d¡ d S )Nr   )r   r   Ú
unregister)r"   r   r   r   r'   ^   s   zSemLock._cleanupc                 C   ó   | j j| _| j j| _d S r   )r   ÚacquireÚrelease©r(   r   r   r   r#   c   ó   
zSemLock._make_methodsc                 C   ó
   | j  ¡ S r   )r   r1   r3   r   r   r   Ú	__enter__g   ó   
zSemLock.__enter__c                 G   r5   r   )r   r2   ©r(   Úargsr   r   r   Ú__exit__j   r7   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__m   s   zSemLock.__getstate__c                 C   s2   t j|Ž | _t d|d |d f ¡ |  ¡  d S )Nz.recreated blocker with handle %r and name "%s"r   r   )r   Ú_rebuildr   r   r    r#   ©r(   Ústater   r   r   Ú__setstate__s   s
   ÿzSemLock.__setstate__c                   C   s   dt  ¡ ttjƒf S )Nz/loky-%i-%s)ÚosÚgetpidÚnextr   Ú_randr   r   r   r   r   y   s   zSemLock._make_nameN)Ú__name__Ú
__module__Ú__qualname__ÚtempfileÚ_RandomNameSequencerE   r.   Ústaticmethodr'   r#   r6   r:   r=   rA   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.   …   ó   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_valuer3   r   r   r   Ú	get_valueˆ   s   

zSemaphore.get_valuec                 C   s6   z| j  ¡ }W n ty   d}Y nw d| jj|f S )NÚunknownz<%s(value=%s)>)r   rT   Ú	ExceptionÚ	__class__rF   rN   r   r   r   Ú__repr__�   s   ÿzSemaphore.__repr__N©r   )rF   rG   rH   r.   rU   rY   r   r   r   r   r
   ƒ   s    
r
   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.   rL   rN   r   r   r   r.   ›   rO   zBoundedSemaphore.__init__c                 C   s<   z| j  ¡ }W n ty   d}Y nw d| jj|| j jf S )NrV   z<%s(value=%s, maxvalue=%s)>)r   rT   rW   rX   rF   r+   rN   r   r   r   rY   ž   s   ÿÿzBoundedSemaphore.__repr__NrZ   )rF   rG   rH   r.   rY   r   r   r   r   r   ™   s    
r   c                       ó$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r   c                    ó   t t| ƒ tdd¡ d S ©Nr   )Úsuperr   r.   rL   r3   ©rX   r   r   r.   ­   ó   zLock.__init__c                 C   sŽ   z3| j  ¡ rt ¡ j}t ¡ jdkr|dt ¡ j 7 }n| j  ¡ dkr&d}n| j  ¡ dkr0d}nd}W n t	y>   d}Y nw d	| j
j|f S )
NÚ
MainThreadú|r   ÚNoner   ÚSomeOtherThreadÚSomeOtherProcessrV   z<%s(owner=%s)>)r   Ú_is_miner   Úcurrent_processr"   Ú	threadingÚcurrent_threadrT   Ú_countrW   rX   rF   )r(   r"   r   r   r   rY   °   s    

€€ÿzLock.__repr__©rF   rG   rH   r.   rY   Ú__classcell__r   r   r_   r   r   «   ó    r   c                       r[   )r	   c                    r\   r]   )r^   r	   r.   ÚRECURSIVE_MUTEXr3   r_   r   r   r.   Ç   r`   zRLock.__init__c                 C   sª   z>| j  ¡ r!t ¡ j}t ¡ jdkr|dt ¡ j 7 }| j  ¡ }n| j  ¡ dkr-d\}}n| j  ¡ dkr9d\}}nd\}}W n t	yK   d\}}Y nw d	| j
j||f S )
Nra   rb   r   )rc   r   r   )rd   Únonzero)re   ro   )rV   rV   ú<%s(%s, %s)>)r   rf   r   rg   r"   rh   ri   rj   rT   rW   rX   rF   )r(   r"   Úcountr   r   r   rY   Ê   s    



€ÿzRLock.__repr__rk   r   r   r_   r   r	   Å   rm   r	   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   rs   rt   ru   rv   r3   r   r   r   r=   é   s   ÿzCondition.__getstate__c                 C   s    |\| _ | _| _| _|  ¡  d S r   )rs   rt   ru   rv   r#   r?   r   r   r   rA   î   s   
ÿzCondition.__setstate__c                 C   r5   r   )rs   r6   r3   r   r   r   r6   ó   r7   zCondition.__enter__c                 G   s   | j j|Ž S r   )rs   r:   r8   r   r   r   r:   ö   s   zCondition.__exit__c                 C   r0   r   )rs   r1   r2   r3   r   r   r   r#   ù   r4   zCondition._make_methodsc                 C   sH   z| j j ¡ | jj ¡  }W n ty   d}Y nw d| jj| j|f S )NrV   rp   )rt   r   rT   ru   rW   rX   rF   rs   )r(   Únum_waitersr   r   r   rY   ý   s   

ÿÿÿzCondition.__repr__c              	   C   sš   | j j ¡ s
J dƒ‚| j ¡  | j j ¡ }t|ƒD ]}| j  ¡  qz| j d|¡W | j	 ¡  t|ƒD ]}| j  ¡  q2S | j	 ¡  t|ƒD ]}| j  ¡  qDw )Nz,must acquire() condition before using wait()T)
rs   r   rf   rt   r2   rj   r   rv   r1   ru   )r(   Útimeoutrq   r-   r   r   r   Úwait  s"   ÿ

ÿ
ýÿzCondition.waitc                 C   s„   | j j ¡ s
J dƒ‚| j d¡rJ ‚| j d¡r(| j d¡}|s"J ‚| j d¡s| j d¡r@| j ¡  | j ¡  | j d¡ d S d S )Núlock is not ownedF)rs   r   rf   rv   r1   ru   rt   r2   )r(   Úresr   r   r   Únotify  s   þ

ûzCondition.notifyc                 C   sÀ   | j j ¡ s
J dƒ‚| j d¡rJ ‚| j d¡r(| j d¡}|s"J ‚| j d¡sd}| j d¡r?| j ¡  |d7 }| j d¡s0|r\t|ƒD ]}| j ¡  qE| j d¡r^	 | j d¡sSd S d S d S )Nr{   Fr   r   )	rs   r   rf   rv   r1   ru   rt   r2   r   )r(   r|   Úsleepersr-   r   r   r   Ú
notify_all.  s&   þ
þÿûzCondition.notify_allc                 C   sf   |ƒ }|r|S |d urt ƒ | }nd }d }|s1|d ur'|t ƒ  }|dkr'	 |S |  |¡ |ƒ }|r|S rr   )Ú_timerz   )r(   Ú	predicatery   ÚresultÚendtimeÚwaittimer   r   r   Úwait_forE  s"   

þúzCondition.wait_forr   )rF   rG   rH   r.   r=   rA   r6   r:   r#   rY   rz   r}   r   r…   r   r   r   r   r   à   s    

	r   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 rr   )r   r   Ú_condr
   Ú_flagr3   r   r   r   r.   ^  s   zEvent.__init__c                 C   sV   | j � | j d¡r| j ¡  	 W d   ƒ dS 	 W d   ƒ dS 1 s$w   Y  d S ©NFT)r†   r‡   r1   r2   r3   r   r   r   Úis_setb  s   
ý$üzEvent.is_setc                 C   sL   | j � | j d¡ | j ¡  | j  ¡  W d   ƒ d S 1 sw   Y  d S ©NF)r†   r‡   r1   r2   r   r3   r   r   r   Úseti  s
   
"ýz	Event.setc                 C   s8   | j � | j d¡ W d   ƒ d S 1 sw   Y  d S rŠ   )r†   r‡   r1   r3   r   r   r   Úclearo  s   "ÿzEvent.clearNc                 C   sz   | j �0 | j d¡r| j ¡  n| j  |¡ | j d¡r*| j ¡  	 W d   ƒ dS 	 W d   ƒ dS 1 s6w   Y  d S rˆ   )r†   r‡   r1   r2   rz   )r(   ry   r   r   r   rz   s  s   
ø	$÷z
Event.waitr   )rF   rG   rH   r.   r‰   r‹   rŒ   rz   r   r   r   r   r   \  s    r   )#rB   rQ   rI   rh   Ú_multiprocessingr   r€   Úcontextr   Ú r   Úmultiprocessingr   r   Ú__all__Úversion_infor   r   r   r   ÚImportErrorÚOSErrorr   Úlistr   rn   rL   rM   Úobjectr
   r   r   r	   r   r   r   r   r   r   Ú<module>   s@   
€ÿH|