U e@sdZddlmZddlZddlZddlmZmZddlm Z m Z ddl m Z ddl mZmZddlmZmZGd d d eZiZeZGd d d eZGd ddeZGdddeZdddgZdS)z8holds locking functionality that works across processes.) annotationsN)ABCabstractmethod)contextmanagersuppress)Path)LockRLock)FileLockTimeoutcs>eZdZddfdd Zd fdd Zd fd d ZZS)_CountedFileLockNonereturnc sTtj|}tj|s6ttt|W5QRXt|d|_ t |_ dSNr) ospathdirnameisdirrOSErrormakedirssuper__init__countr thread_safe)self lock_fileparent __class__B/opt/hc_python/lib/python3.8/site-packages/virtualenv/util/lock.pyrs    z_CountedFileLock.__init__N皙?csN|jj|dkrdn|ds$t|j|jdkrrCrrGrIr r r r!r/.s  r/cseZdZddfdd ZdddZedd Zddd d Zd d ZddZ dddZ eddZ e dddZ e ddZZS)ReentrantFileLockr rcst|d|_dSr0)rr_lock)rr3rr r!rMs zReentrantFileLock.__init__c CsLt|j|d}t*|tkr.t|t|<t|W5QRSQRXdSNz.lock)r4r _store_lock _lock_storer )rrErr r r! _create_lockQs  zReentrantFileLock._create_lockc CsF|dk rBt0|j|jdkr.t|jdW5QRXW5QRXdSr)rNrrrOpoprlockr r r! _del_lockXs zReentrantFileLock._del_lockcCs||jdSr0)rTrKr7r r r!__del___szReentrantFileLock.__del__cCs||_||jdSr0)rPrK _lock_filer7r r r!r>bs zReentrantFileLock.__enter__cCs"||j||jd|_dSr0)_releaserKrTr?r r r!rCfs  zReentrantFileLock.__exit__Fc Csptttt|jW5QRXz|dWn8tk rj|rHt d|j | |YnXdS)Ng-C6?z/lock file %s present, will block until released) rrrrr4rr&r loggingdebugrr))rrSrFr r r!rVks zReentrantFileLock._lock_filecCs |dSr0)r)rRr r r!rW{szReentrantFileLock._releasec csH||}z(z|||dVW5||XW5||d}XdSr0)rPrTrWrV)rrErFrSr r r!rGs    zReentrantFileLock.lock_for_keyc cs.tt|j|d dVW5QRXdSrM)r r4rrHr r r!rIsz,ReentrantFileLock.non_reentrant_lock_for_key)rL)F)F)r+r,r-rrP staticmethodrTrUr>rCrVrWrrGrIr.r r rr!rJLs     rJc@s6eZdZddZddZed ddZedd Zd S) NoOpFileLockcCstdSr0r<r7r r r!r>szNoOpFileLock.__enter__cCstdSr0r<r?r r r!rCszNoOpFileLock.__exit__Fccs dVdSr0r rDr r r!rGszNoOpFileLock.lock_for_keyccs dVdSr0r rHr r r!rIsz'NoOpFileLock.non_reentrant_lock_for_keyN)F)r+r,r-r>rCrrGrIr r r r!r[s  r[r )__doc__ __future__rrXrabcrr contextlibrrpathlibr threadingrr filelockr r r rOrNr/rJr[__all__r r r r!s$  F