Skip to content

Commit a6c34b2

Browse files
committed
CABI: switch from asyncio.Condition to asyncio.Event
1 parent 7343112 commit a6c34b2

File tree

1 file changed

+12
-15
lines changed

1 file changed

+12
-15
lines changed

design/mvp/canonical-abi/definitions.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -222,21 +222,20 @@ class ComponentInstance:
222222
table: Table
223223
may_leave: bool
224224
backpressure: bool
225+
unblocked: asyncio.Event
225226
calling_sync_export: bool
226-
calling_sync_import: bool
227227
pending_tasks: list[tuple[Task, asyncio.Future]]
228228
starting_pending_task: bool
229-
async_waiting_tasks: asyncio.Condition
230229

231230
def __init__(self):
232231
self.table = Table()
233232
self.may_leave = True
234233
self.backpressure = False
234+
self.unblocked = asyncio.Event()
235+
self.unblocked.set()
235236
self.calling_sync_export = False
236-
self.calling_sync_import = False
237237
self.pending_tasks = []
238238
self.starting_pending_task = False
239-
self.async_waiting_tasks = asyncio.Condition(scheduler)
240239

241240
#### Table State
242241

@@ -519,7 +518,7 @@ def trap_if_on_the_stack(self, inst):
519518

520519
def may_enter(self, pending_task):
521520
return not self.inst.backpressure and \
522-
not self.inst.calling_sync_import and \
521+
self.inst.unblocked.is_set() and \
523522
not (self.inst.calling_sync_export and pending_task.opts.sync)
524523

525524
def maybe_start_pending_task(self):
@@ -536,23 +535,22 @@ async def sync_wait(self, awaitable) -> None:
536535
awaitable = asyncio.ensure_future(awaitable)
537536
if awaitable.done() and not DETERMINISTIC_PROFILE and random.randint(0,1):
538537
return
539-
assert(not self.inst.calling_sync_import)
540-
self.calling_sync_import = True
538+
assert(self.inst.unblocked.is_set())
539+
self.inst.unblocked.clear()
541540
if await self.on_block(awaitable) == Cancelled.TRUE:
542541
assert(self.state == Task.State.INITIAL)
543542
self.state = Task.State.PENDING_CANCEL
544543
assert(await self.on_block(awaitable) == Cancelled.FALSE)
545-
self.inst.calling_sync_import = False
546-
self.inst.async_waiting_tasks.notify_all()
544+
self.inst.unblocked.set()
547545

548546
async def async_wait(self, awaitable) -> Cancelled:
549547
self.maybe_start_pending_task()
550548
awaitable = asyncio.ensure_future(awaitable)
551549
if awaitable.done() and not DETERMINISTIC_PROFILE and random.randint(0,1):
552550
return Cancelled.FALSE
553551
cancelled = await self.on_block(awaitable)
554-
while self.inst.calling_sync_import:
555-
cancelled |= await self.on_block(self.inst.async_waiting_tasks.wait())
552+
while not self.inst.unblocked.is_set():
553+
cancelled |= await self.on_block(self.inst.unblocked.wait())
556554
if cancelled:
557555
awaitable.cancel()
558556
return cancelled
@@ -565,11 +563,10 @@ async def sync_on_block(awaitable):
565563
assert(await self.on_block(awaitable) == Cancelled.FALSE)
566564
return Cancelled.FALSE
567565

568-
assert(not self.inst.calling_sync_import)
569-
self.inst.calling_sync_import = True
566+
assert(self.inst.unblocked.is_set())
567+
self.inst.unblocked.clear()
570568
await callee(self, on_start, on_return, sync_on_block)
571-
self.inst.calling_sync_import = False
572-
self.inst.async_waiting_tasks.notify_all()
569+
self.inst.unblocked.set()
573570

574571
async def wait_for_event(self, wset, sync) -> EventTuple:
575572
if self.state == Task.State.PENDING_CANCEL:

0 commit comments

Comments
 (0)