U
    /e                     @   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k
rT   d dlmZ Y nX dgZzd dl	Z	W n ek
r.   zd dl
Z
d dlZ
d dlZW n ek
r   edY nxX 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X 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)kernel32T)use_last_error   Fc                 C   sD   t t|  dddd}|r"dS t }|dkr<t|dS d S )Nr      T!   F)_WinAPI_LockFilemsvcrtget_osfhandlefilenoctypesZget_last_errorZWinError)file_reserr r   3/tmp/pip-unpacked-wheel-jbqiki5d/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   s   t |  t j d S N)fcntlflockr   LOCK_EXr   r   r   r   _lock_file_blocking3   s    r   c              
   C   sd   zt |  t jt jB  W dS  tk
r^ } z"|jtjtjfkrLW Y 
dS  W 5 d }~X Y nX d S )NTF)	r   r   r   r   ZLOCK_NBIOErrorerrnoEACCESEAGAIN)r   errorr   r   r   r   6   s    
c                 C   s   t |  t j d S r   )r   r   r   ZLOCK_UNr   r   r   r   r   @   s    c                 K   sF   t   z&t| }|d kr,t| }|t| < W 5 t   X t|f|S r   )_locks_lockacquirerelease_locksget_create_lock_file_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   r0   Z   s   r0   c                 C   sT   |d krd}t  }|  }|r d S |d k	rFt  | |krFtd|qt| qd S )Ng?zCouldn't lock {0})get_timer0   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 )r/   c                 C   s
   || _ d S r   )r&   )selflocksr   r   r   __init__o   s    z_LockSet.__init__c                 C   sT   g }z&| j D ]}||| || qW n$   t|D ]}|  q: Y nX d S r   )r&   r$   appendreversedr%   )r;   r6   r7   Zacquired_locksr,   Zacquired_lockr   r   r   r$   r   s    

z_LockSet.acquirec                 C   s   t | jD ]}|  q
d S r   )r?   r&   r%   )r;   r,   r   r   r   r%   ~   s    z_LockSet.releaseNr1   r2   r3   r=   r$   r%   r   r   r   r   r/   n   s   r/   c                   @   s&   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                    s2   |d kr j   nt fdd|| jd d S )Nc                      s    j dS )NF)rD   r$   r   r;   r   r   <lambda>       z%_ThreadLock.acquire.<locals>.<lambda>r$   r6   r7   r*   )rD   r$   r:   rA   r;   r6   r7   r   rF   r   r$      s    
z_ThreadLock.acquirec                 C   s   | j   d S r   rD   r%   rF   r   r   r   r%      s    z_ThreadLock.release)NNr@   r   r   r   r   r-      s   
r-   c                   @   s&   e Zd Zdd ZdddZdd ZdS )	r.   c                 C   s   || _ d | _d S r   )rA   _filerE   r   r   r   r=      s    z_LockFile.__init__Nc                    sb   t | jd z4|d kr$tr$t  nt fdd||| jd W n       Y nX  | _d S )Nwbc                      s   t  S r   )r   r   fileobjr   r   rG      rH   z#_LockFile.acquire.<locals>.<lambda>rI   )openrA   _lock_file_blocking_availabler   r:   closerL   rJ   r   rN   r   r$      s    


z_LockFile.acquirec                 C   s0   | j d krtdt| j  | j   d | _ d S )Nzcannot release unlocked lock)rL   r0   r   rR   rF   r   r   r   r%      s
    


z_LockFile.release)NNr@   r   r   r   r   r.      s   
r.   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   )rD   _timeout_retry_period)r;   r,   r6   r7   r   r   r   r=      s    z_Locker.__init__c                 C   s   | j | j| j d S r   )rD   r$   rS   rT   rF   r   r   r   r$      s    z_Locker.acquirec                 C   s   | j   d S r   rK   rF   r   r   r   r%      s    z_Locker.releasec                 C   s   |    | S r   )r$   rF   r   r   r   	__enter__   s    z_Locker.__enter__c                 G   s   |    d S r   )r%   )r;   argsr   r   r   __exit__   s    z_Locker.__exit__)NN)	r1   r2   r3   __doc__r=   r$   r%   rU   rW   r   r   r   r   r)      s   
r)   )+r   rB   r   r   weakrefr   r4   ImportError__all__r   r   Zctypes.wintypesr   ZWinDLLZ	_kernel32LockFiler   ZwintypesZBOOLrestypeZHANDLEZDWORDargtypesZ
UnlockFiler   rQ   r   r   r   rC   r#   WeakValueDictionaryr&   r   r(   	Exceptionr0   r:   objectr/   r-   r.   r)   r   r   r   r   <module>   sR   


#