
    er                     X    d dl Z ddlmZ  G d dej                        Z G d de      Zy)    N   )QtCorec                   R    e Zd ZdZd ZddZddZd ZddZd Z	d	 Z
d
 Zd Zd Zy)MutexaM  
    Subclass of QMutex that provides useful debugging information during
    deadlocks--tracebacks are printed for both the code location that is 
    attempting to lock the mutex as well as the location that has already
    acquired the lock.
    
    Also provides __enter__ and __exit__ methods for use in "with" statements.
    c                    |j                  dd      rt        j                  j                  f}t        j                  j                  | g|  t        j                         | _        g | _        |j                  dd      | _        y )N	recursiveFdebug)	getr   QMutex	Recursive__init__ltbpopr	   )selfargskargss      6/usr/lib/python3/dist-packages/pyqtgraph/util/mutex.pyr   zMutex.__init__   s_    99[%(MM++-Dt+d+YYw.
    Nc                 $   | t         j                  j                  |       }n t         j                  j                  | |      }| j                  r|r| j                  j                          	 |@| j                  j                  dj                  t        j                         d d              n'| j                  j                  dt        |      z          | j                  j                          |S |S # | j                  j                          w xY w)N z  )r   r   tryLockr	   r   lockr   appendjoin	tracebackformat_stackstrunlock)r   timeoutidlockeds       r   r   zMutex.tryLock   s    ?]]**40F]]**49F::&FFKKM :GGNN2779+A+A+CCR+H#IJGGNN4#b'>2 v s   ,A)C3 3Dc                    d}d}	 | j                  ||      ry |dz  }| j                  r| j                  j                          	 t	        d||z  dz  z         t        j                          t        | j                        dkD  r$t	        d       t	        | j                  d          nt	        d       | j                  j                          # | j                  j                          w xY w)	Nr   i     z6Waiting for mutex lock (%0.1f sec). Traceback follows:g     @@z Mutex is currently locked from:
r   z$Mutex is currently locked from [???])
r   r	   r   r   printr   print_stacklenr   r    )r   r"   cwaitTimes       r   r   z
Mutex.lock)   s    ||Hb)FAzz
$RxZ-/ 0))+477|a'ABdggbk*DEFFMMO!   FFMMOs   A/C C+c                    t         j                  j                  |        | j                  ru| j                  j                          	 t        | j                        dkD  r| j                  j                          nt        d      	 | j                  j                          y y # | j                  j                          w xY w)Nr   z1Attempt to unlock mutex before it has been locked)
r   r   r    r	   r   r   r(   r   r   	Exceptionr   s    r   r    zMutex.unlock?   s    T"::FFKKM tww<!#GGKKM#$WXX "   s   >B" "B>c                 "    | j                         S )zVMimics threading.Lock.acquire() to allow this class as a drop-in replacement.
        )r   )r   blockings     r   acquirezMutex.acquireL   s     ||~r   c                 $    | j                          y)zVMimics threading.Lock.release() to allow this class as a drop-in replacement.
        Nr    r-   s    r   releasezMutex.releaseQ   s     	r   c                     | j                   j                          t        | j                        }| j                   j	                          |S N)r   r   r(   r   r    )r   ns     r   depthzMutex.depthV   s.    Lr   c                     | j                   j                          	 | j                  d d  }| j                   j                          |S # | j                   j                          w xY wr5   )r   r   r   r    )r   rets     r   r   zMutex.traceback\   sD    	''!*CFFMMO
 FFMMOs   A A#c                 $    | j                          y r5   r2   )r   r   s     r   __exit__zMutex.__exit__d   s    r   c                 &    | j                          | S r5   )r   r-   s    r   	__enter__zMutex.__enter__g   s    		r   )NNr5   )T)__name__
__module____qualname____doc__r   r   r   r    r0   r3   r7   r   r;   r=    r   r   r   r      s9    /$$, 

r   r   c                       e Zd ZdZd Zy)RecursiveMutexz"Mimics threading.RLock class.
    c                 :    d|d<   t        j                  | fi | y )NTr   )r   r   )r   kwdss     r   r   zRecursiveMutex.__init__o   s     [t$t$r   N)r>   r?   r@   rA   r   rB   r   r   rD   rD   l   s    %r   rD   )r   Qtr   r   r   rD   rB   r   r   <module>rH      s*     cFMM cL%U %r   