B
    è¹`-  ã               @   s0  d Z ddlZddlZddlZddlZyddlZW n ek
rL   ddlZY nX ye 	¡  dZ
W n6   yddlZdZ
W n ek
rŽ   dZ
Y nX Y nX ddlmZ ddlmZ ddd	d
dgZG dd
„ d
eƒZe ¡ Zdd„ Zdd„ 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 )z¸Synchronization functions.

File- and mutex-based mutual exclusion synchronizers are provided,
as well as a name-based mutex which locks within an application
based on a string name.

é    NFT)Úutil)Ú	LockErrorÚfile_synchronizerÚmutex_synchronizerÚnull_synchronizerÚNameLockÚ
_threadingc               @   sD   e Zd ZdZe ¡ ZG dd„ deƒZddd„Z	dd	d
„Z
dd„ ZdS )r   zØa proxy for an RLock object that is stored in a name based
    registry.

    Multiple threads can get a reference to the same RLock based on the
    name alone, and synchronize operations related to that name.

    c               @   s   e Zd Zdd„ Zdd„ ZdS )zNameLock.NLContainerc             C   s   |rt  ¡ | _n
t  ¡ | _d S )N)r   ÚRLockÚlockÚLock)ÚselfÚ	reentrant© r   ú^/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/beaker/synchronization.pyÚ__init__/   s    zNameLock.NLContainer.__init__c             C   s   | j S )N)r
   )r   r   r   r   Ú__call__5   s    zNameLock.NLContainer.__call__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   ÚNLContainer.   s   r   NFc             C   s.   |d krt  |¡| _nt j |t j|¡| _d S )N)r   r   Ú_lockÚlocksÚget)r   Ú
identifierr   r   r   r   r   8   s    zNameLock.__init__Tc             C   s   |   ¡  |¡S )N)r   Úacquire)r   Úwaitr   r   r   r   ?   s    zNameLock.acquirec             C   s   |   ¡  ¡  d S )N)r   Úrelease)r   r   r   r   r   B   s    zNameLock.release)NF)T)r   r   r   Ú__doc__r   ÚWeakValuedRegistryr   Úobjectr   r   r   r   r   r   r   r   r   $   s   


c             K   s   t j| |f|| f|ŽS )N)Ú_synchronizersZsync_get)r   ÚclsÚkwargsr   r   r   Ú_synchronizerI   s    r#   c             K   s&   t rd|krt| ƒS t| tf|ŽS d S )NÚlock_dir)Ú	has_flockr   r#   ÚFileSynchronizer)r   r"   r   r   r   r   M   s    c             K   s   t | tf|ŽS )N)r#   ÚConditionSynchronizer)r   r"   r   r   r   r   T   s    c               @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZeZeZ	dS )r   zmA 'null' synchronizer, which provides the :class:`.SynchronizerImpl` interface
    without any locking.

    Tc             C   s   dS )NTr   )r   r   r   r   r   Úacquire_write_lock]   s    z$null_synchronizer.acquire_write_lockc             C   s   d S )Nr   )r   r   r   r   Úacquire_read_lock`   s    z#null_synchronizer.acquire_read_lockc             C   s   d S )Nr   )r   r   r   r   Úrelease_write_lockc   s    z$null_synchronizer.release_write_lockc             C   s   d S )Nr   )r   r   r   r   Úrelease_read_lockf   s    z#null_synchronizer.release_read_lockN)T)
r   r   r   r   r(   r)   r*   r+   r   r   r   r   r   r   r   X   s   
c               @   s„   e Zd ZdZdd„ ZG dd„ deƒZdd„ ZeeƒZdd	„ Z	ddd„Z
dd„ ZeZddd„ZeZdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSynchronizerImplz_Base class for a synchronization object that allows
    multiple readers, single writers.

    c             C   s   t  ¡ | _d S )N)r   ÚThreadLocalÚ_state)r   r   r   r   r   q   s    zSynchronizerImpl.__init__c               @   s   e Zd ZdZdd„ ZdS )zSynchronizerImpl.SyncState)ÚreentrantcountÚwritingÚreadingc             C   s   d| _ d| _d| _d S )Nr   F)r/   r0   r1   )r   r   r   r   r   w   s    z#SynchronizerImpl.SyncState.__init__N)r   r   r   Ú	__slots__r   r   r   r   r   Ú	SyncStatet   s   r3   c             C   s0   | j  ¡ s"t ¡ }| j  |¡ |S | j  ¡ S d S )N)r.   Zhasr,   r3   Úputr   )r   Ústater   r   r   r5   |   s
    
zSynchronizerImpl.statec             C   sL   | j }|jrtdƒ‚|js"tdƒ‚|jdkr:|  ¡  d|_| jd8  _d S )Nzlock is in writing statezlock is not in reading stateé   F)r5   r0   r   r1   r/   Údo_release_read_lock)r   r5   r   r   r   r+   …   s    
z"SynchronizerImpl.release_read_lockTc             C   sd   | j }|jrtdƒ‚|jdkrH|  |¡}|s0|rD| jd7  _d|_|S |jr`| jd7  _dS d S )Nzlock is in writing stater   r6   T)r5   r0   r   r/   Údo_acquire_read_lockr1   )r   r   r5   Úxr   r   r   r)   “   s    

z"SynchronizerImpl.acquire_read_lockc             C   sL   | j }|jrtdƒ‚|js"tdƒ‚|jdkr:|  ¡  d|_| jd8  _d S )Nzlock is in reading statezlock is not in writing stater6   F)r5   r1   r   r0   r/   Údo_release_write_lock)r   r5   r   r   r   r*   £   s    
z#SynchronizerImpl.release_write_lockc             C   sd   | j }|jrtdƒ‚|jdkrH|  |¡}|s0|rD| jd7  _d|_|S |jr`| jd7  _dS d S )Nzlock is in reading stater   r6   T)r5   r1   r   r/   Údo_acquire_write_lockr0   )r   r   r5   r9   r   r   r   r(   ³   s    

z#SynchronizerImpl.acquire_write_lockc             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r   r   r   r   r7   Å   s    z%SynchronizerImpl.do_release_read_lockc             C   s
   t ƒ ‚d S )N)r<   )r   r   r   r   r   r8   È   s    z%SynchronizerImpl.do_acquire_read_lockc             C   s
   t ƒ ‚d S )N)r<   )r   r   r   r   r:   Ë   s    z&SynchronizerImpl.do_release_write_lockc             C   s
   t ƒ ‚d S )N)r<   )r   r   r   r   r   r;   Î   s    z&SynchronizerImpl.do_acquire_write_lockN)T)T)r   r   r   r   r   r   r3   r5   Úpropertyr+   r)   r*   r   r(   r   r7   r8   r:   r;   r   r   r   r   r,   l   s   

r,   c                   sh   e Zd ZdZ‡ fdd„Zdd„ ZeeƒZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Z‡  ZS )r&   z/A synchronizer which locks using flock().

    c                sV   t t| ƒ ¡  t ¡ | _|d kr*t ¡ }n|}tj||gdd| _	t
j | j	¡| _d S )Nz.lock)Ú	extension)Úsuperr&   r   r   r-   Ú_filedescriptorÚtempfileÚ
gettempdirZencoded_pathÚfilenameÚosÚpathÚdirnamer$   )r   r   r$   )Ú	__class__r   r   r   Ö   s    


zFileSynchronizer.__init__c             C   s
   | j  ¡ S )N)r@   r   )r   r   r   r   Ú	_filedescæ   s    zFileSynchronizer._filedescc             C   s   t j | j¡st | j¡ d S )N)rD   rE   Úexistsr$   r   Zverify_directory)r   r   r   r   Ú
_ensuredirê   s    zFileSynchronizer._ensuredirc             C   s4   | j }|d kr0|  ¡  t | j|¡}| j |¡ |S )N)rH   rJ   rD   ÚopenrC   r@   r4   )r   ÚmodeÚfiledescriptorr   r   r   Ú_openî   s    zFileSynchronizer._openc             C   sp   |   tjtjB ¡}|sZyt |tjtjB ¡ dS  tk
rV   t 	|¡ | j
 ¡  dS X nt |tj¡ dS d S )NTF)rN   rD   ÚO_CREATÚO_RDONLYÚfcntlÚflockZLOCK_SHÚLOCK_NBÚIOErrorÚcloser@   Úremove)r   r   rM   r   r   r   r8   ö   s    

z%FileSynchronizer.do_acquire_read_lockc             C   sp   |   tjtjB ¡}|sZyt |tjtjB ¡ dS  tk
rV   t 	|¡ | j
 ¡  dS X nt |tj¡ dS d S )NTF)rN   rD   rO   ÚO_WRONLYrQ   rR   ZLOCK_EXrS   rT   rU   r@   rV   )r   r   rM   r   r   r   r;     s    

z&FileSynchronizer.do_acquire_write_lockc             C   s   |   ¡  d S )N)Ú_release_all_locks)r   r   r   r   r7     s    z%FileSynchronizer.do_release_read_lockc             C   s   |   ¡  d S )N)rX   )r   r   r   r   r:     s    z&FileSynchronizer.do_release_write_lockc             C   s4   | j }|d k	r0t |tj¡ t |¡ | j ¡  d S )N)rH   rQ   rR   ZLOCK_UNrD   rU   r@   rV   )r   rM   r   r   r   rX     s
    
z#FileSynchronizer._release_all_locks)r   r   r   r   r   rH   r=   rJ   rN   r8   r;   r7   r:   rX   Ú__classcell__r   r   )rG   r   r&   Ò   s   r&   c                   sD   e Zd ZdZ‡ fdd„Zddd„Zdd„ Zdd	d
„Zdd„ Z‡  Z	S )r'   z!a synchronizer using a Condition.c                s.   t t| ƒ ¡  d| _d | _t t ¡ ¡| _d S )Nr   )	r?   r'   r   ÚasynchÚcurrent_sync_operationr   Ú	Conditionr   Ú	condition)r   r   )rG   r   r   r   #  s    zConditionSynchronizer.__init__Tc             C   sd   | j  ¡  z@|r,x(| jd k	r(| j  ¡  qW n| jd k	r:dS |  jd7  _W d | j  ¡  X |s`dS d S )NFr6   T)r]   r   r[   r   rZ   r   )r   r   r   r   r   r8   /  s    

z*ConditionSynchronizer.do_acquire_read_lockc             C   s`   | j  ¡  zD|  jd8  _| jdkr:| jd k	rL| j  ¡  n| jdk rLtdƒ‚W d | j  ¡  X d S )Nr6   r   z7Synchronizer error - too many release_read_locks called)r]   r   rZ   r[   Ú	notifyAllr   r   )r   r   r   r   r7   C  s    



z*ConditionSynchronizer.do_release_read_lockc             C   s„   | j  ¡  z`|r,x(| jd k	r(| j  ¡  qW n| jd k	r:dS t ¡ | _| jdkrh|r^| j  ¡  n
d | _dS W d | j  ¡  X |s€dS d S )NFr   T)r]   r   r[   r   r   ÚcurrentThreadrZ   r   )r   r   r   r   r   r;   U  s     



z+ConditionSynchronizer.do_acquire_write_lockc             C   sF   | j  ¡  z*| jt ¡ k	r"tdƒ‚d | _| j  ¡  W d | j  ¡  X d S )Nz>Synchronizer error - current thread doesnt have the write lock)r]   r   r[   r   r_   r   r^   r   )r   r   r   r   r:   y  s    
z+ConditionSynchronizer.do_release_write_lock)T)T)
r   r   r   r   r   r8   r7   r;   r:   rY   r   r   )rG   r   r'      s   

$r'   )r   ÚerrnorD   ÚsysrA   Ú	threadingr   ÚImportErrorZdummy_threadingÚgetwindowsversionr%   rQ   Zbeakerr   Zbeaker.exceptionsr   Ú__all__r   r   r   r    r#   r   r   r   r,   r&   r'   r   r   r   r   Ú<module>   s<   "fN