B
    ª0H[ö	  ã               @   s&   d Z ddlZddlZG dd„ dƒZdS )z
Synchronization primitives:

    - reader-writer lock (preference to writers)

(Contributed to Django by eugene@lazutkin.com)
é    Nc               @   sT   e Zd ZdZdd„ Zdd„ Zdd„ Zejdd	„ ƒZ	d
d„ Z
dd„ Zejdd„ ƒZdS )ÚRWLocka(  
    Classic implementation of reader-writer lock with preference to writers.

    Readers can access a resource simultaneously.
    Writers get an exclusive access.

    API is self-descriptive:
        reader_enters()
        reader_leaves()
        writer_enters()
        writer_leaves()
    c             C   s>   t  ¡ | _t  d¡| _t  d¡| _d| _d| _d| _d| _	d S )Nr   )
Ú	threadingÚRLockÚmutexÚ	SemaphoreÚcan_readÚ	can_writeÚactive_readersÚactive_writersÚwaiting_readersÚwaiting_writers)Úself© r   úVC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\utils\synch.pyÚ__init__   s    
zRWLock.__init__c          	   C   s\   | j �B | jdkr6| jdkr6|  jd7  _| j ¡  n|  jd7  _W d Q R X | j ¡  d S )Nr   é   )r   r
   r   r	   r   Úreleaser   Úacquire)r   r   r   r   Úreader_enters#   s    zRWLock.reader_entersc          	   C   s^   | j �N |  jd8  _| jdkrP| jdkrP|  jd7  _|  jd8  _| j ¡  W d Q R X d S )Nr   r   )r   r	   r   r
   r   r   )r   r   r   r   Úreader_leaves,   s    zRWLock.reader_leavesc             c   s"   |   ¡  z
d V  W d |  ¡  X d S )N)r   r   )r   r   r   r   Úreader4   s    
zRWLock.readerc          	   C   sf   | j �L | jdkr@| jdkr@| jdkr@|  jd7  _| j ¡  n|  jd7  _W d Q R X | j ¡  d S )Nr   r   )r   r
   r   r	   r   r   r   )r   r   r   r   Úwriter_enters<   s    zRWLock.writer_entersc          	   C   sš   | j �Š |  jd8  _| jdkrH|  jd7  _|  jd8  _| j ¡  nD| jdkrŒ| j}d| _|  j|7  _x|dkrŠ| j ¡  |d8 }qnW W d Q R X d S )Nr   r   )r   r
   r   r   r   r   r	   r   )r   Útr   r   r   Úwriter_leavesE   s    



zRWLock.writer_leavesc             c   s"   |   ¡  z
d V  W d |  ¡  X d S )N)r   r   )r   r   r   r   ÚwriterT   s    
zRWLock.writerN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Ú
contextlibÚcontextmanagerr   r   r   r   r   r   r   r   r      s   			r   )r   r   r   r   r   r   r   r   Ú<module>   s   