
 X	                 @   s8   d  Z  d d l Z d d l Z Gd d   d e  Z d S)z
Synchronization primitives:

    - reader-writer lock (preference to writers)

(Contributed to Django by eugene@lazutkin.com)
    Nc               @   s|   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   @/home/ubuntu/projects/ifolica/build/django/django/utils/synch.py__init__   s    			zRWLock.__init__c          
   C   sm   |  j  Q |  j d k rG |  j d k rG |  j d 7_ |  j j   n |  j d 7_ Wd  QX|  j j   d  S)Nr      )r   r
   r   r	   r   releaser   acquire)r   r   r   r   reader_enters#   s    
zRWLock.reader_entersc          
   C   so   |  j  ` |  j d 8_ |  j d k re |  j d k re |  j d 7_ |  j d 8_ |  j j   n  Wd  QXd  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Wd  |  j   Xd  S)N)r   r   )r   r   r   r   reader4   s    
	zRWLock.readerc          
   C   s|   |  j  ` |  j d k rV |  j d k rV |  j d k rV |  j d 7_ |  j j   n |  j d 7_ Wd  QX|  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 rV |  j d 7_ |  j d 8_ |  j j   n] |  j d k r |  j } d |  _ |  j | 7_ x* | d k r |  j j   | d 8} q Wn  Wd  QXd  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Wd  |  j   Xd  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   