o ;b @sddlmZddlZddlZddlZddlZddlZddlmZm Z ddl m Z ddl m Z ddlmZddlmZed ZGd d d ZGd d d eejZd d gZdS)) annotationsN)ABCabstractmethod)Lock) TracebackType)Any)Timeoutfilelockc@s.eZdZdZdddZddd ZdddZdS)AcquireReturnProxyzDA context aware object that will release the lock file when exiting.lock BaseFileLockreturnNonecCs ||_dSNr )selfr r//usr/lib/python3/dist-packages/filelock/_api.py__init__s zAcquireReturnProxy.__init__cC|jSrrrrrr __enter__szAcquireReturnProxy.__enter__exc_typetype[BaseException] | None exc_valueBaseException | None tracebackTracebackType | NonecCs|jdSr)r releaserrrrrrr__exit__szAcquireReturnProxy.__exit__N)r r rrrr rrrrrrrr)__name__ __module__ __qualname____doc__rrr!rrrrr s   r c@seZdZdZd3d4d d Zed5d d Zed6ddZejd7ddZe d8ddZ e d8ddZ ed9ddZ  d:ddd;d!d"Z dd'd(Zd?d/d0Zd8d1d2ZdS)@r z+Abstract base class for a file lock object. lock_filestr | os.PathLike[Any]timeoutfloatrrcCs*t||_d|_||_t|_d|_dS)a Create a new lock object. :param lock_file: path to the file :param timeout: default timeout when acquiring the lock. It will be used as fallback value in the acquire method, if no timeout value (``None``) is given. If you want to disable the timeout, set it to a negative value. A timeout of 0 means, that there is exactly one attempt to acquire the file lock. Nr)osfspath _lock_file _lock_file_fdr+r _thread_lock _lock_counter)rr)r+rrrr*s  zBaseFileLock.__init__strcCr)z:return: path to the lock file)r/rrrrr)DszBaseFileLock.lock_filecCr)zU :return: the default timeout value .. versionadded:: 2.0.0 )_timeoutrrrrr+IszBaseFileLock.timeoutvalue float | strcCst||_dS)zX Change the default timeout value. :param value: the new value N)r,r4)rr5rrrr+RscCt)zbIf the file lock could be acquired, self._lock_file_fd holds the file descriptor of the lock file.NotImplementedErrorrrrr_acquire[zBaseFileLock._acquirecCr7)z6Releases the lock and sets self._lock_file_fd to None.r8rrrr_release`r;zBaseFileLock._releaseboolcCs |jduS)z :return: A boolean indicating if the lock file is holding the lock currently. .. versionchanged:: 2.0.0 This was previously a method and is now a property. N)r0rrrr is_lockedes zBaseFileLock.is_lockedN皙?)poll_intervall float | None poll_intervalr@r c Cs|dur|j}|durd}tj|tdd|}|j|jd7_Wdn1s,wYt|}|j}t }z[ |j|j sPt d||| Wdn1sZwY|j rjt d||n,d |krxt |krnn t d ||t|jd }t ||||t|q>Wn$ty|jtd |jd|_Wd1swYwt|d S) az Try to acquire the file lock. :param timeout: maximum wait time for acquiring the lock, ``None`` means use the default :attr:`~timeout` is and if ``timeout < 0``, there is no timeout and this method will block until the lock could be acquired :param poll_interval: interval of trying to acquire the lock file :param poll_intervall: deprecated, kept for backwards compatibility, use ``poll_interval`` instead :raises Timeout: if fails to acquire lock within the timeout period :return: a context object that will unlock the file when the context is exited .. code-block:: python # You can use this method in the context manager (recommended) with lock.acquire(): pass # Or use an equivalent try-finally construct: lock.acquire() try: pass finally: lock.release() .. versionchanged:: 2.0.0 This method returns now a *proxy* object instead of *self*, so that it can be used in a with statement without side effects. Nz+use poll_interval instead of poll_intervall) stacklevelrTz#Attempting to acquire lock %s on %szLock %s acquired on %srz"Timeout on acquiring lock %s on %sz2Lock %s not acquired on %s, waiting %s seconds ...r)r+warningswarnDeprecationWarningr1r2idr/time monotonicr>_LOGGERdebugr:r sleep BaseExceptionmaxr )rr+rBr@msglock_id lock_filename start_timerrracquireqsP%      zBaseFileLock.acquireFforcecCs|jG|jr:|jd8_|jdks|rBt||j}}td|||d|_td||WddSWddSWddS1sMwYdS)a* Releases the file lock. Please note, that the lock is only completely released, if the lock counter is 0. Also note, that the lock file itself is not automatically deleted. :param force: If true, the lock counter is ignored and the lock is released in every case/ rrz#Attempting to release lock %s on %szLock %s released on %sN)r1r>r2rHr/rKrLr<)rrUrQrRrrrrs"zBaseFileLock.releasecCs ||S)zE Acquire the lock. :return: the lock object )rTrrrrrszBaseFileLock.__enter__rrrrrrcCs |dS)z Release the lock. :param exc_type: the exception type if raised :param exc_value: the exception value if raised :param traceback: the exception traceback if raised Nrr rrrr!s zBaseFileLock.__exit__cCs|jdddS)z'Called when the lock object is deleted.T)rUNrVrrrr__del__szBaseFileLock.__del__)r()r)r*r+r,rr)rr3)rr,)r5r6rr)rr)rr=)Nr?)r+rArBr,r@rArr )F)rUr=rrr"r#)r$r%r&r'rpropertyr)r+setterrr:r<r>rTrrr!rWrrrrr 's0         K  r ) __future__r contextlibloggingr-rIrEabcrr threadingrtypesrtypingr_errorr getLoggerrKr ContextDecoratorr __all__rrrrs$      H