
    ug                     d    d dl Z d dlmZ d dlmZmZ  G d d      Z G d d      Z G d d	      Zy)
    N)TracebackType)OptionalTypec                   8    e Zd ZdZddZddZddZddZddZy)	ReadWriteLockzYA lock object that allows many simultaneous "read locks", but
    only one "write lock." Nc                 j    t        j                  t        j                               | _        d| _        y )Nr   )	threading	ConditionRLock_read_ready_readersselfs    S/var/www/openai/venv/lib/python3.12/site-packages/chromadb/utils/read_write_lock.py__init__zReadWriteLock.__init__
   s#    $..y/@A    c                     | j                   j                          	 | xj                  dz  c_        | j                   j                          y# | j                   j                          w xY w)zQAcquire a read lock. Blocks only if a thread has
        acquired the write lock.   N)r   acquirer   releaser   s    r   acquire_readzReadWriteLock.acquire_read   sN     	  "	'MMQM$$&D$$&s   A A(c                 "   | j                   j                          	 | xj                  dz  c_        | j                  s| j                   j                          | j                   j	                          y# | j                   j	                          w xY w)zRelease a read lock.r   N)r   r   r   
notify_allr   r   s    r   release_readzReadWriteLock.release_read   se      "	'MMQM==  ++-$$&D$$&s   ;A2 2Bc                     | j                   j                          | j                  dkD  r+| j                   j                          | j                  dkD  r*yy)zUAcquire a write lock. Blocks until there are no
        acquired read or write locks.r   N)r   r   r   waitr   s    r   acquire_writezReadWriteLock.acquire_write!   sB     	  "mma!!# mmar   c                 8    | j                   j                          y)zRelease a write lock.N)r   r   r   s    r   release_writezReadWriteLock.release_write(   s      "r   returnN)	__name__
__module____qualname____doc__r   r   r   r   r    r   r   r   r      s     ''$#r   r   c                   P    e Zd ZdefdZd
dZdeee      dee   dee	   ddfd	Z
y)
ReadRWLockrwLockc                     || _         y Nr)   r   r)   s     r   r   zReadRWLock.__init__.   	    r   r!   Nc                 8    | j                   j                          y r+   )r)   r   r   s    r   	__enter__zReadRWLock.__enter__1   s      "r   exc_type	exc_value	tracebackc                 8    | j                   j                          y r+   )r)   r   r   r1   r2   r3   s       r   __exit__zReadRWLock.__exit__4   s     	  "r   r    r"   r#   r$   r   r   r0   r   r   BaseExceptionr   r6   r&   r   r   r(   r(   -   sR    } ##4./# M*# M*	#
 
#r   r(   c                   P    e Zd ZdefdZd
dZdeee      dee   dee	   ddfd	Z
y)WriteRWLockr)   c                     || _         y r+   r,   r-   s     r   r   zWriteRWLock.__init__>   r.   r   r!   Nc                 8    | j                   j                          y r+   )r)   r   r   s    r   r0   zWriteRWLock.__enter__A   s    !!#r   r1   r2   r3   c                 8    | j                   j                          y r+   )r)   r   r5   s       r   r6   zWriteRWLock.__exit__D   s     	!!#r   r    r7   r&   r   r   r:   r:   =   sR    } $$4./$ M*$ M*	$
 
$r   r:   )	r	   typesr   typingr   r   r   r(   r:   r&   r   r   <module>r@      s-      !$# $#N# # $ $r   