diff --git a/asyncio/core.py b/asyncio/core.py index 149b46f..e9260b6 100644 --- a/asyncio/core.py +++ b/asyncio/core.py @@ -94,11 +94,11 @@ def sleep(t): ################################################################################ # "Never schedule" object" -# Don't re-schedule the object that awaits the _never singleton. +# Don't re-schedule the object that awaits _never(). # For internal use only. Some constructs, like `await event.wait()`, # work by NOT re-scheduling the task which calls wait(), but by # having some other task schedule it later. -class _Never: +class _NeverSingletonGenerator: def __init__(self): self.state = None self.exc = StopIteration() @@ -117,7 +117,10 @@ def __next__(self): self.exc.__traceback__ = None raise self.exc -_never = _Never() +def _never(sgen=_NeverSingletonGenerator()): + # assert sgen.state is None, "Check for a missing `await` in your code" + sgen.state = False + return sgen ################################################################################ @@ -150,13 +153,11 @@ def _dequeue(self, s): async def queue_read(self, s): self._enqueue(s, 0) - _never.state = False - await _never + await _never() async def queue_write(self, s): self._enqueue(s, 1) - _never.state = False - await _never + await _never() def remove(self, task): while True: diff --git a/asyncio/event.py b/asyncio/event.py index 442c5bb..164a269 100644 --- a/asyncio/event.py +++ b/asyncio/event.py @@ -62,8 +62,7 @@ async def wait(self): self.waiting.push_head(core.cur_task) # Set calling task's data to the event's queue so it can be removed if needed core.cur_task.data = self.waiting - core._never.state = False - await core._never + await core._never() return True diff --git a/asyncio/lock.py b/asyncio/lock.py index b5080a3..71c972f 100644 --- a/asyncio/lock.py +++ b/asyncio/lock.py @@ -69,8 +69,7 @@ async def acquire(self): # Set calling task's data to the lock's queue so it can be removed if needed core.cur_task.data = self.waiting try: - core._never.state = False - await core._never + await core._never() except core.CancelledError as er: if self.state == core.cur_task: # Cancelled while pending on resume, schedule next waiting Task