3
(h	                 @   s(   d Z ddlZddlZG dd de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 j | _t jd| _t j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   6/tmp/pip-install-q3hcpn_q/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j  n|  jd7  _W d Q R X | j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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"   | j   z
d V  W d | j  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j  n|  jd7  _W d Q R X | j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j  nD| jdkr| j}d| _|  j|7  _x|dkr| j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"   | j   z
d V  W d | j  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   objectr   r   r   r   r   <module>   s   