o
    c.                     @   s~   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ G dd deZ	dd Z
dd	 Zd
d ZejdejdefddZdS )    N)Optional)_utilsc                   @   s   e Zd Z	 dZdZejejfddZe	de
fddZdd	e
de
fd
dZde
fddZe	dee fddZejdd Zejdd ZdS )ReaderWriterLockwrc                 C   s*   	 d | _ t | _i | _| | _|| _d S N)_writercollectionsdeque_pending_writers_readers_cond_current_thread)selfZcondition_clsZcurrent_thread_functor r   RG:\Development\the-witcher-3-mod-manager\.venv\lib\site-packages\fasteners\lock.py__init__#   s   

zReaderWriterLock.__init__returnc                 C   s   	 t | jS r   )boolr   r   r   r   r   has_pending_writers4   s   
z$ReaderWriterLock.has_pending_writersTcheck_pendingc                 C   s*   	 |   }| j|krdS |r|| jv S dS )NTF)r   r   r   )r   r   mer   r   r   	is_writer=   s   	

zReaderWriterLock.is_writerc                 C   s   	 |   }|| jv S r   )r   r   )r   r   r   r   r   	is_readerO   s   
zReaderWriterLock.is_readerc                 C   s$   	 	 | j d ur
| jS | jr| jS d S r   )r   WRITERr   READERr   r   r   r   ownerX   s   
zReaderWriterLock.ownerc                 c   s   	 |   }|| jv rtd| | j7 	 | jd u s | j|kr>|| jv r0| j| d | j|< n| j|ks8| js>d| j|< n| j  qW d    n1 sNw   Y  zB| V  W | j1 z| j| }|dkrn|d | j|< n| j| W n	 t	y~   Y nw | j
  W d    d S 1 sw   Y  d S | j0 z| j| }|dkr|d | j|< n| j| W n	 t	y   Y nw | j
  W d    w 1 sw   Y  w )NzFWriter %s can not acquire a read lock while waiting for the write lockT   )r   r   RuntimeErrorr   r   r   r   waitpopKeyError
notify_all)r   r   Zme_instancesr   r   r   	read_lockf   sZ   




*
zReaderWriterLock.read_lockc                 c   s0   	 |   }| jdd}|  r|std| |r| V  d S | j/ | j| 	 t| jdkrD| j	d u rD| jd |krD| j
 | _	n| j  q*W d    n1 sTw   Y  z"| V  W | j d | _	| j  W d    d S 1 suw   Y  d S | j d | _	| j  W d    w 1 sw   Y  w )NF)r   z4Reader %s to writer privilege escalation not allowedTr   )r   r   r   r   r   r   appendlenr   r   popleftr    r#   )r   r   Zi_am_writerr   r   r   
write_lock   s<   	

	*zReaderWriterLock.write_lockN)T)__name__
__module____qualname__r   r   	threading	Conditioncurrent_threadr   propertyr   r   r   r   r   strr   
contextlibcontextmanagerr$   r(   r   r   r   r   r      s"    
	
.r   c                     6   	  fdd} s| s|S t | dkr|| d S |S )Nc                    s4    dd  dt fdd}|S )Nlock_lockloggerc                    s   t |  }t|ttfrFtjd*}t|D ]\}}||s)t	d|d  q| g|R i |W  d    S 1 s?w   Y  d S |}| | g|R i |W  d    S 1 s`w   Y  d S )N)r6   zUnable to acquire lock %sr   )
getattr
isinstancetuplelistr   	LockStack	enumerateacquire_lockr,   ThreadError)r   argskwargs
attr_valuestackir4   	attr_namefr6   r   r   wrapper   s   

$$z*locked.<locals>.decorator.<locals>.wrapperget	functoolswrapsrF   rG   r@   rD   r   	decorator   s
   
zlocked.<locals>.decoratorr   r   r&   r?   r@   rN   r   rM   r   locked   s   rQ   c                     r3   )Nc                    (    dd t fdd}|S )Nr4   r5   c                    L   t |  }|  | g|R i |W  d    S 1 sw   Y  d S r   )r7   r$   r   r?   r@   Zrw_lockrE   rF   r   r   rG        

$z/read_locked.<locals>.decorator.<locals>.wrapperrH   rL   rM   rU   r   rN         zread_locked.<locals>.decoratorr   r   rO   rP   r   rM   r   read_locked      rX   c                     r3   )Nc                    rR   )Nr4   r5   c                    rS   r   )r7   r(   rT   rU   r   r   rG   $  rV   z0write_locked.<locals>.decorator.<locals>.wrapperrH   rL   rM   rU   r   rN   !  rW   zwrite_locked.<locals>.decoratorr   r   rO   rP   r   rM   r   write_locked  rY   rZ   r4   r   c                 c   s<    	 |  d}z|V  W |r|   d S d S |r|   w w )NF)acquirerelease)r4   Z
was_lockedr   r   r   try_lock7  s   

r]   )r	   r1   rJ   r,   typingr   	fastenersr   objectr   rQ   rX   rZ   r2   Lockr   r]   r   r   r   r   <module>   s    7##