Fix shutdown deadlock (#9724)
Fix shutdown deadlock in poller
The issue was that iree_task_poller_pump_until_exit only checked
for IREE_TASK_POLLER_STATE_EXITING at the beginning of each loop
iteration, then reset wake_event, then called
iree_task_poller_commit_wait.
Meanwhile, on the main thread, iree_task_poller_request_exit could
change state to IREE_TASK_POLLER_STATE_EXITING and set wake_event.
So in a race, iree_task_poller_pump_until_exit would reset the
wake_event set by iree_task_poller_request_exit, and that would leave
iree_task_poller_commit_wait waiting infinitely.
Fixes #9723
diff --git a/runtime/src/iree/task/poller.c b/runtime/src/iree/task/poller.c
index ee6465b..12a38d9 100644
--- a/runtime/src/iree/task/poller.c
+++ b/runtime/src/iree/task/poller.c
@@ -418,6 +418,12 @@
// wait handles were resolved.
static void iree_task_poller_commit_wait(iree_task_poller_t* poller,
iree_time_t deadline_ns) {
+ if (iree_atomic_load_int32(&poller->state, iree_memory_order_seq_cst) ==
+ IREE_TASK_POLLER_STATE_EXITING) {
+ // Thread exit requested - don't block shutdown.
+ return;
+ }
+
IREE_TRACE_ZONE_BEGIN(z0);
// Enter the system wait API.