ó
	GÏOc           @   s\   d  Z  d d l Z y d d l Z Wn e k
 rA d d l Z n Xd e f d „  ƒ  YZ d S(   s   
Synchronization primitives:

    - reader-writer lock (preference to writers)

(Contributed to Django by eugene@lazutkin.com)
iÿÿÿÿNt   RWLockc           B   s_   e  Z d  Z d „  Z d „  Z d „  Z e j d „  ƒ Z d „  Z	 d „  Z
 e j d „  ƒ Z RS(   s(  
    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(   Ni    (
   t	   threadingt   RLockt   mutext	   Semaphoret   can_readt	   can_writet   active_readerst   active_writerst   waiting_readerst   waiting_writers(   t   self(    (    s+   ../Django//lib/python/django/utils/synch.pyt   __init__   s    			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(   Ni    i   (   R   R   R
   R   R   t   releaseR	   t   acquire(   R   (    (    s+   ../Django//lib/python/django/utils/synch.pyt   reader_enters&   s    
c         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(   Ni   i    (   R   R   R
   R   R   R   (   R   (    (    s+   ../Django//lib/python/django/utils/synch.pyt   reader_leaves/   s    
c         c   s%   |  j  ƒ  z	 d  VWd  |  j ƒ  Xd  S(   N(   R   R   (   R   (    (    s+   ../Django//lib/python/django/utils/synch.pyt   reader7   s    
	c      	   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(   Ni    i   (   R   R   R
   R   R   R   R   (   R   (    (    s+   ../Django//lib/python/django/utils/synch.pyt   writer_enters?   s    
-c         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(   Ni   i    (   R   R   R
   R   R   R	   R   R   (   R   t   t(    (    s+   ../Django//lib/python/django/utils/synch.pyt   writer_leavesH   s    
		c         c   s%   |  j  ƒ  z	 d  VWd  |  j ƒ  Xd  S(   N(   R   R   (   R   (    (    s+   ../Django//lib/python/django/utils/synch.pyt   writerW   s    
	(   t   __name__t
   __module__t   __doc__R   R   R   t
   contextlibt   contextmanagerR   R   R   R   (    (    (    s+   ../Django//lib/python/django/utils/synch.pyR       s   								(   R   R   R   t   ImportErrort   dummy_threadingt   objectR    (    (    (    s+   ../Django//lib/python/django/utils/synch.pyt   <module>   s   