withdraw/helpers.py
Vlad Stan a3861204e2
Some checks failed
/ release (push) Has been cancelled
/ pullrequest (push) Has been cancelled
Fix withdraw increment (#26)
* Fix: made increment/is_spent more specific
* fix: make safe `increment_withdraw_link `
* fix: remove old fix
* chore: code format

---------

Co-authored-by: benarc <ben@arc.wales>
2024-03-19 14:19:23 +01:00

49 lines
1 KiB
Python

from threading import Lock
from typing import Dict
class CounterLock:
def __init__(self):
self.counter = 0
self.lock = Lock()
def acquire(self) -> bool:
self.counter += 1
return self.lock.acquire()
def release(self) -> None:
self.counter -= 1
return self.lock.release()
@property
def no_more_waiters(self) -> bool:
return self.counter == 0
class NamedLock:
_lock = Lock()
_locks: Dict[str, CounterLock] = {}
def acquire(self, name: str) -> bool:
self._lock.acquire()
if name not in self._locks:
self._locks[name] = CounterLock()
self._lock.release()
return self._locks[name].acquire()
def release(self, name: str):
self._lock.acquire()
if name not in self._locks:
return self._lock.release()
self._locks[name].release()
if self._locks[name].no_more_waiters:
del self._locks[name]
return self._lock.release()