diff --git a/mlir/lib/ExecutionEngine/AsyncRuntime.cpp b/mlir/lib/ExecutionEngine/AsyncRuntime.cpp --- a/mlir/lib/ExecutionEngine/AsyncRuntime.cpp +++ b/mlir/lib/ExecutionEngine/AsyncRuntime.cpp @@ -320,10 +320,11 @@ CoroHandle handle, CoroResume resume) { auto execute = [handle, resume]() { (*resume)(handle); }; + std::unique_lock lock(token->mu); if (token->ready) { + lock.unlock(); execute(); } else { - std::unique_lock lock(token->mu); token->awaiters.push_back([execute]() { execute(); }); } } @@ -332,10 +333,11 @@ CoroHandle handle, CoroResume resume) { auto execute = [handle, resume]() { (*resume)(handle); }; + std::unique_lock lock(value->mu); if (value->ready) { + lock.unlock(); execute(); } else { - std::unique_lock lock(value->mu); value->awaiters.push_back([execute]() { execute(); }); } } @@ -344,10 +346,11 @@ CoroHandle handle, CoroResume resume) { auto execute = [handle, resume]() { (*resume)(handle); }; + std::unique_lock lock(group->mu); if (group->pendingTokens == 0) { + lock.unlock(); execute(); } else { - std::unique_lock lock(group->mu); group->awaiters.push_back([execute]() { execute(); }); } }