From a9f68c297172954db523216d45dd3643f7779375 Mon Sep 17 00:00:00 2001 From: agessaman Date: Thu, 19 Feb 2026 19:31:56 -0800 Subject: [PATCH] modify event callback handling to call synchronous callbacks inline, ensuring futures are resolved before waiting. This prevents race conditions when scheduling callbacks asynchronously. --- src/meshcore/events.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/meshcore/events.py b/src/meshcore/events.py index f11694d..051fff5 100644 --- a/src/meshcore/events.py +++ b/src/meshcore/events.py @@ -183,8 +183,16 @@ class EventDispatcher: ): continue - # Fire the call back asychronously - asyncio.create_task(self._execute_callback(subscription.callback, event.clone())) + # Call sync callbacks inline so futures are resolved before asyncio.wait() + # returns - avoids the race where create_task schedules the callback after + # the waiter has already timed out with done=set(). + if asyncio.iscoroutinefunction(subscription.callback): + asyncio.create_task(self._execute_callback(subscription.callback, event.clone())) + else: + try: + subscription.callback(event.clone()) + except Exception as e: + logger.error(f"Error in event handler for {event.type}: {e}", exc_info=True) self.queue.task_done()