B
    F.\-                 @   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 n ek
r   yd dlZd dlZd dl	Z	W n ek
rz   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	lock_filez?Platform not supported (failed to import fcntl, ctypes, msvcrt)Zkernel32T)Z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_Zreserr r   1lib/python3.7/site-packages/distributed/locket.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_EX)r   r   r   r   _lock_file_blocking3   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_NBIOErrorerrnoZEACCESZEAGAIN)r   errorr   r   r   r   6   s    c             C   s   t |  t j d S )N)r   r   r	   ZLOCK_UN)r   r   r   r   r   @   s    c             K   sF   t   z&t| }|d kr,t| }|t| < W d t   X t|f|S )N)_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 )N)_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   r&   Z   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_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 )N)r   )selfZlocksr   r   r   __init__o   s    z_LockSet.__init__c             C   s\   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/   r,   r-   Zacquired_locksr"   Zacquired_lockr   r   r   r   r   s    z_LockSet.acquirec             C   s    xt | jD ]}|  qW d S )N)r2   r   r   )r/   r"   r   r   r   r   ~   s    z_LockSet.releaseN)r'   r(   r)   r0   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 )N)_path	threadingLock_lock)r/   r    r   r   r   r0      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)r6   r   r   )r/   r   r   <lambda>   s    z%_ThreadLock.acquire.<locals>.<lambda>)r   r,   r-   r    )r6   r   r.   r3   )r/   r,   r-   r   )r/   r   r      s    
z_ThreadLock.acquirec             C   s   | j   d S )N)r6   r   )r/   r   r   r   r      s    z_ThreadLock.release)NN)r'   r(   r)   r0   r   r   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 | _t | _d S )N)r3   _filer4   r5   Z_thread_lock)r/   r    r   r   r   r0      s    z_LockFile.__init__Nc                sN    j d krt jd _ |d kr0tr0t j  nt fdd|| jd d S )Nwbc                  s
   t  jS )N)r   r8   r   )r/   r   r   r7      s    z#_LockFile.acquire.<locals>.<lambda>)r   r,   r-   r    )r8   openr3   _lock_file_blocking_availabler   r.   )r/   r,   r-   r   )r/   r   r      s    

z_LockFile.acquirec             C   s   t | j | j  d | _d S )N)r   r8   close)r/   r   r   r   r      s    

z_LockFile.release)NN)r'   r(   r)   r0   r   r   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 )N)r6   _timeout_retry_period)r/   r"   r,   r-   r   r   r   r0      s    z_Locker.__init__c             C   s   | j | j| j d S )N)r6   r   r=   r>   )r/   r   r   r   r      s    z_Locker.acquirec             C   s   | j   d S )N)r6   r   )r/   r   r   r   r      s    z_Locker.releasec             C   s   |    | S )N)r   )r/   r   r   r   	__enter__   s    z_Locker.__enter__c             G   s   |    d S )N)r   )r/   argsr   r   r   __exit__   s    z_Locker.__exit__)NN)	r'   r(   r)   __doc__r0   r   r   r?   rA   r   r   r   r   r      s   
r   )(r*   r   r4   weakref__all__r   ImportErrorr
   Zctypes.wintypesr   ZWinDLLZ	_kernel32ZLockFiler   ZwintypesZBOOLZrestypeZHANDLEZDWORDZargtypesZ
UnlockFiler   r;   r   r   r   r5   r   WeakValueDictionaryr   r   r   	Exceptionr&   r.   objectr%   r#   r$   r   r   r   r   r   <module>   sJ   


