a :i@sdZddlZddlZddlmZmZddlmZddlm Z ddl m Z m Z ddl mZmZGdd d eZiZe ZGd d d ed ZGd ddeZGdddeZgdZdS)z7holds locking functionality that works across processesN)ABCMetaabstractmethod)contextmanager)Path)LockRLock)FileLockTimeoutcs8eZdZfddZd fdd Zd fdd ZZS) _CountedFileLockcsXtj|}tj|s:zt|Wnty8Yn0t|d|_t |_ dSNr) ospathdirnameisdirmakedirsOSErrorsuper__init__countr thread_safe)self lock_fileparent __class__8/usr/lib/python3.9/site-packages/virtualenv/util/lock.pyrs    z_CountedFileLock.__init__N皙?csN|jj|durdn|ds$t|j|jdkrrrrnon_reentrant_lock_for_keyHsz'PathLockBase.non_reentrant_lock_for_keyN)F) r%r&r'rr1r5r6rr9r<rr@rBrrrrr)-s  r)) metaclasscszeZdZfddZdddZeddZdd Zd d Zd d Z dddZ eddZ e dddZ e ddZZS)ReentrantFileLockcst|d|_dSr*)rr_lock)rr-rrrrOs zReentrantFileLock.__init__cCsXt|j|d}t,|tvr.t|t|<t|WdS1sJ0YdSNz.lock)strr _store_lock _lock_storer )rr>rrrr _create_lockSs  zReentrantFileLock._create_lockc Csn|durjtN|j(|jdkr.t|jdWdn1sB0YWdn1s`0YdSr )rIrrrJpoprlockrrr _del_lockZs  zReentrantFileLock._del_lockcCs||jdSr*)rOrEr0rrr__del__bszReentrantFileLock.__del__cCs||_||jdSr*)rKrE _lock_filer0rrrr9es zReentrantFileLock.__enter__cCs"||j||jd|_dSr*)_releaserErOr:rrrr<is  zReentrantFileLock.__exit__FcCsrztt|jWnty&Yn0z|dWn6tyl|rJtd|j | |Yn0dS)Ng-C6?z/lock file %s present, will block until released) r rrHr rr!r loggingdebugrr#)rrNr?rrrrQns  zReentrantFileLock._lock_filecCs |dSr*)r#rMrrrrRszReentrantFileLock._releasec cs`||}z@z |||dVW||n ||0W||d}n||d}0dSr*)rKrQrRrO)rr>r?rNrrrr@s    zReentrantFileLock.lock_for_keyccsBtt|j|ddVWdn1s40YdSrG)r rHr rArrrrBsz,ReentrantFileLock.non_reentrant_lock_for_key)rF)F)F)r%r&r'rrK staticmethodrOrPr9r<rQrRrr@rBr(rrrrrDNs      rDc@s6eZdZddZddZed ddZedd Zd S) NoOpFileLockcCstdSr*r7r0rrrr9szNoOpFileLock.__enter__cCstdSr*r7r:rrrr<szNoOpFileLock.__exit__Fccs dVdSr*rr=rrrr@szNoOpFileLock.lock_for_keyccs dVdSr*rrArrrrBsz'NoOpFileLock.non_reentrant_lock_for_keyN)F)r%r&r'r9r<rr@rBrrrrrVs  rV)rVrDr )__doc__rSr abcrr contextlibrpathlibr threadingrrZfilelockrr r rJrIr)rDrV__all__rrrrs  !H