Skip to content

Commit

Permalink
fix: potential hanging edge case (#57)
Browse files Browse the repository at this point in the history
  • Loading branch information
BobTheBuidler authored Aug 29, 2023
1 parent 8b80206 commit d997b1d
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion a_sync/primitives/locks/prio_semaphore.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ def __init__(self, value: int = 1, *, name: Optional[str] = None) -> None:
self._capacity = value
super().__init__(value, name=name)
self._waiters = []
# NOTE: This should (hopefully) be temporary
self._potential_lost_waiters = []

def __repr__(self) -> str:
return f"<{self.__class__.__name__} name={self.name} capacity={self._capacity} value={self._value} waiters={[manager._repr_no_parent_() for manager in self._waiters]}>"
Expand Down Expand Up @@ -85,9 +87,10 @@ def _wake_up_next(self) -> None:

while manager._waiters:
waiter = manager._waiters.popleft()
waiter = self._potential_lost_waiters.remove(waiter)
if not waiter.done():
waiter.set_result(None)
logger.debug(f"woke up %s", waiter)
logger.debug("woke up %s", waiter)
woke_up = True
break

Expand All @@ -106,6 +109,15 @@ def _wake_up_next(self) -> None:
# There are no more waiters, get rid of the empty manager
self._context_managers.pop(manager._priority)
return

# emergency procedure (hopefully temporary):
while self._potential_lost_waiters:
waiter = self._potential_lost_waiters.pop(0)
logger.debug('we found a lost waiter %s', waiter)
if not waiter.done():
waiter.set_result(None)
logger.warning("woke up lost waiter %s", waiter)
return
logger.debug("%s has no waiters to wake", self)

class _AbstractPrioritySemaphoreContextManager(Semaphore, Generic[PT]):
Expand Down Expand Up @@ -156,6 +168,7 @@ async def acquire(self) -> Literal[True]:
while self._parent._value <= 0:
fut = self.loop.create_future()
self.waiters.append(fut)
self._parent._potential_lost_waiters.append(fut)
try:
await fut
except:
Expand Down

0 comments on commit d997b1d

Please sign in to comment.