B
    ղ[U                  @   s  d dl Z d dlZd dlZd dlZdgZyd dlZW nR ek
r   yd dlZW n ek
rj   edY nX 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dS )    N	lock_filez7Platform not supported (failed to import fcntl, msvcrt)Fc             C   s2   yt |  t jd dS  tk
r,   dS X d S )N   TF)msvcrtlockingfilenoZLK_NBLCKIOError)file_ r	   .lib/python3.7/site-packages/locket/__init__.py_lock_file_non_blocking   s
    r   c             C   s   t |  t jd d S )Nr   )r   r   r   ZLK_UNLCK)r   r	   r	   r
   _unlock_file   s    r   Tc             C   s   t |  t j d S )N)fcntlflockr   LOCK_EX)r   r	   r	   r
   _lock_file_blocking    s    r   c          
   C   s\   yt |  t jt jB  dS  tk
rV } z|jtjtjgkrDdS  W d d }~X Y nX d S )NTF)	r   r   r   r   ZLOCK_NBr   errnoZEACCESZEAGAIN)r   errorr	   r	   r
   r   #   s    c             C   s   t |  t j d S )N)r   r   r   ZLOCK_UN)r   r	   r	   r
   r   -   s    c             K   sB   t   z*t| }|d kr0t| f|}|t| < |S t   X d S )N)_locks_lockacquire_locksget_create_lock_filerelease)pathkwargslockr	   r	   r
   r   5   s    
c             K   s$   t | f|}t| f|}t||gS )N)_ThreadLock	_LockFile_LockSet)r   r   Zthread_lockZ	file_lockr	   r	   r
   r   A   s    r   c               @   s   e Zd ZdS )	LockErrorN)__name__
__module____qualname__r	   r	   r	   r
   r   G   s   r   c             C   s^   |d krd}t   }xD|  }|r$d S |d k	rLt   | |krLtd|qt | qW d S )Ng?zCouldn't lock {0})timer   formatZsleep)r   timeoutretry_periodr   Z
start_timeZsuccessr	   r	   r
   _acquire_non_blockingK   s    r'   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c             C   s
   || _ d S )N)r   )selfZlocksr	   r	   r
   __init__\   s    z_LockSet.__init__c             C   sX   g }y&x | j D ]}|  || qW W n(   xt|D ]}|  q<W  Y nX d S )N)r   r   appendreversedr   )r(   Zacquired_locksr   Zacquired_lockr	   r	   r
   r   _   s    z_LockSet.acquirec             C   s    xt | jD ]}|  qW d S )N)r+   r   r   )r(   r   r	   r	   r
   r   k   s    z_LockSet.releasec             C   s   |    | S )N)r   )r(   r	   r	   r
   	__enter__p   s    z_LockSet.__enter__c             G   s   |    d S )N)r   )r(   argsr	   r	   r
   __exit__t   s    z_LockSet.__exit__N)r    r!   r"   r)   r   r   r,   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   Nc             C   s    || _ || _|| _t | _d S )N)_path_timeout_retry_period	threadingLock_lock)r(   r   r%   r&   r	   r	   r
   r)   y   s    z_ThreadLock.__init__c                s8    j d kr j  nt fdd j  j jd d S )Nc                  s    j dS )NF)r4   r   r	   )r(   r	   r
   <lambda>   s    z%_ThreadLock.acquire.<locals>.<lambda>)r   r%   r&   r   )r0   r4   r   r'   r1   r/   )r(   r	   )r(   r
   r      s    

z_ThreadLock.acquirec             C   s   | j   d S )N)r4   r   )r(   r	   r	   r
   r      s    z_ThreadLock.release)NN)r    r!   r"   r)   r   r   r	   r	   r	   r
   r   x   s   
r   c               @   s&   e Zd ZdddZdd Zdd ZdS )	r   Nc             C   s&   || _ || _|| _d | _t | _d S )N)r/   r0   r1   _filer2   r3   Z_thread_lock)r(   r   r%   r&   r	   r	   r
   r)      s
    z_LockFile.__init__c                sT    j d krt jd _  jd kr2tr2t j  nt fdd j j jd d S )Nwc                  s
   t  jS )N)r   r6   r	   )r(   r	   r
   r5      s    z#_LockFile.acquire.<locals>.<lambda>)r   r%   r&   r   )r6   openr/   r0   _lock_file_blocking_availabler   r'   r1   )r(   r	   )r(   r
   r      s    

z_LockFile.acquirec             C   s   t | j | j  d | _d S )N)r   r6   close)r(   r	   r	   r
   r      s    

z_LockFile.release)NN)r    r!   r"   r)   r   r   r	   r	   r	   r
   r      s   
r   )r#   r   r2   weakref__all__r   ImportErrorr   r9   r   r   r   r3   r   WeakValueDictionaryr   r   r   	Exceptionr   r'   objectr   r   r   r	   r	   r	   r
   <module>   s6   
