o
    Nrf                     @   s  d dl Z d dlZd dlmZ d dlZzd dlmZ W n ey)   d dlmZ Y nw dgZzd dl	Z	W n^ ey   zd dl
Z
d dlZ
d dlZW n eyS   edw e
jddd	ZejZe
jje_e
jjge
jjgd
  e_ejZe
jje_e
jjge
jjgd
  e_dZdd Zdd ZY nw dZdd Zdd Zdd Ze Ze Z dd Z!dd Z"G dd de#Z$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*dS )#    N)sleep)	monotonic)time	lock_filez?Platform not supported (failed to import fcntl, ctypes, msvcrt)Zkernel32T)Zuse_last_error   Fc                 C   s@   t t|  dddd}|rdS t }|dkrt|dS )Nr      T!   F)_WinAPI_LockFilemsvcrtget_osfhandlefilenoctypesZget_last_errorZWinError)file_reserr r   X/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/locket/__init__.py_lock_file_non_blocking#   s   
r   c                 C   s   t t|  dddd d S )Nr   r   )_WinAPI_UnlockFiler
   r   r   r   r   r   r   _unlock_file.   s   r   c                 C      t |  t j d S N)fcntlflockr   LOCK_EXr   r   r   r   _lock_file_blocking3      r   c              
   C   sZ   zt |  t jt jB  W dS  ty, } z|jtjtjfv r'W Y d }~dS  d }~ww )NTF)	r   r   r   r   LOCK_NBIOErrorerrnoEACCESEAGAIN)r   errorr   r   r   r   6   s   c                 C   r   r   )r   r   r   LOCK_UNr   r   r   r   r   @   r   c                 K   sR   t   zt| }|d u rt| }|t| < W t   nt   w t|fi |S r   )_locks_lockacquire_locksget_create_lock_filerelease_Locker)pathkwargslockr   r   r   r   H   s   
c                 C   s   t | }t| }t||gS r   )_ThreadLock	_LockFile_LockSet)r,   Zthread_lockZ	file_lockr   r   r   r)   T   s   r)   c                   @   s   e Zd ZdS )	LockErrorN)__name__
__module____qualname__r   r   r   r   r2   Z   s    r2   c                 C   sP   |d u rd}t  }	 |  }|rd S |d ur#t  | |kr#td|t| q
)Ng?TzCouldn't lock {0})get_timer2   formatr   )r&   timeoutretry_periodr,   
start_timesuccessr   r   r   _acquire_non_blocking^   s   r<   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r1   c                 C   s
   || _ d S r   )r'   )selflocksr   r   r   __init__o   s   
z_LockSet.__init__c                 C   sL   g }z| j D ]}||| || qW d S    t|D ]}|  q r   )r'   r&   appendreversedr*   )r=   r8   r9   Zacquired_locksr.   Zacquired_lockr   r   r   r&   r   s   

z_LockSet.acquirec                 C   s   t | jD ]}|  qd S r   )rA   r'   r*   )r=   r.   r   r   r   r*   ~   s   
z_LockSet.releaseNr3   r4   r5   r?   r&   r*   r   r   r   r   r1   n   s    r1   c                   @   &   e Zd Zdd ZdddZdd ZdS )	r/   c                 C   s   || _ t | _d S r   )_path	threadingLock_lockr=   r,   r   r   r   r?      s   z_ThreadLock.__init__Nc                    s4   |d u r j   d S t fdd|| jd d S )Nc                      s    j dS )NF)rG   r&   r   r=   r   r   <lambda>   s    z%_ThreadLock.acquire.<locals>.<lambda>r&   r8   r9   r,   )rG   r&   r<   rD   r=   r8   r9   r   rI   r   r&      s   

z_ThreadLock.acquirec                 C      | j   d S r   rG   r*   rI   r   r   r   r*         z_ThreadLock.releaseNNrB   r   r   r   r   r/      s    
r/   c                   @   rC   )	r0   c                 C   s   || _ d | _d S r   )rD   _filerH   r   r   r   r?      s   
z_LockFile.__init__Nc                    s\   t | jd z|d u rtrt  nt fdd||| jd W n        | _d S )Nwbc                      s   t  S r   )r   r   fileobjr   r   rJ      s    z#_LockFile.acquire.<locals>.<lambda>rK   )openrD   _lock_file_blocking_availabler   r<   closerQ   rL   r   rS   r   r&      s   


z_LockFile.acquirec                 C   s0   | j d u r	tdt| j  | j   d | _ d S )Nzcannot release unlocked lock)rQ   r2   r   rW   rI   r   r   r   r*      s
   



z_LockFile.releaserP   rB   r   r   r   r   r0      s    
r0   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )r+   zg
    A lock wrapper to always apply the given *timeout* and *retry_period*
    to acquire() calls.
    Nc                 C   s   || _ || _|| _d S r   )rG   _timeout_retry_period)r=   r.   r8   r9   r   r   r   r?      s   
z_Locker.__init__c                 C   s   | j | j| j d S r   )rG   r&   rX   rY   rI   r   r   r   r&      r   z_Locker.acquirec                 C   rM   r   rN   rI   r   r   r   r*      rO   z_Locker.releasec                 C   s   |    | S r   )r&   rI   r   r   r   	__enter__   s   z_Locker.__enter__c                 G   s   |    d S r   )r*   )r=   argsr   r   r   __exit__   s   z_Locker.__exit__rP   )	r3   r4   r5   __doc__r?   r&   r*   rZ   r\   r   r   r   r   r+      s    
r+   )+r    rE   r   r   weakrefr   r6   ImportError__all__r   r   Zctypes.wintypesr
   ZWinDLLZ	_kernel32ZLockFiler	   ZwintypesZBOOLrestypeZHANDLEZDWORDargtypesZ
UnlockFiler   rV   r   r   r   rF   r%   WeakValueDictionaryr'   r   r)   	Exceptionr2   r<   objectr1   r/   r0   r+   r   r   r   r   <module>   sZ    

"
#