Source code for pumaguard.lock_manager

"""
A simple lock manager.
"""

import logging
import threading
import time

logger = logging.getLogger("PumaGuard")

_GLOBAL_LOCK = threading.Lock()


[docs] class PumaGuardLock: """ A global lock. """ def __init__(self, lock: threading.Lock): self._lock = lock self._acquire_started_at: float | None = None
[docs] def acquire(self) -> bool: """ Acquire the lock. Record when the acquire attempt started so we can measure how long we have been waiting or have held the lock since the call. """ self._acquire_started_at = time.monotonic() ok = self._lock.acquire() if not ok: self._acquire_started_at = None raise RuntimeError("Unable to acquire lock") return True
[docs] def release(self): """ Releases the lock. """ self._lock.release() self._acquire_started_at = None
[docs] def time_waited(self) -> float: """ Return the time since acquire() was called (how long we've been waiting/held). """ return ( 0.0 if self._acquire_started_at is None else time.monotonic() - self._acquire_started_at )
[docs] def release(lock: PumaGuardLock): """ Release the lock. """ logger.debug("Releasing lock") lock.release()
[docs] def acquire_lock() -> PumaGuardLock: """ Acquire the lock. This method will block until the lock is available. """ logger.debug("Acquiring lock") lock = PumaGuardLock(_GLOBAL_LOCK) lock.acquire() return lock