diff --git a/emper/io/IoContext.hpp b/emper/io/IoContext.hpp index 60b1e99a8a55194a08ab236135119ccda891aa93..b8aa5b9cb585a82ef7fdf48e98919c26615d01c2 100644 --- a/emper/io/IoContext.hpp +++ b/emper/io/IoContext.hpp @@ -413,6 +413,12 @@ class IoContext : public Logger<LogSubsystem::IO> { return reapCompletionsLockless<callerEnvironment>(continuations, toReap); } + // CallerEnvironment::EMPER means we are in a stealing worker. + // Check if the victim's CQ is empty before taking the lock. + if constexpr (callerEnvironment == CallerEnvironment::EMPER) { + if (!cqeCount()) return 0; + } + return reapCompletionsLocked<callerEnvironment>(continuations, toReap); } diff --git a/emper/strategies/AbstractWorkStealingScheduler.cpp b/emper/strategies/AbstractWorkStealingScheduler.cpp index 83ca87697bed3529b67f7e2ae5a5b544c06bcb39..5f20567f130017815a6b7abb01ff1e94560b42ae 100644 --- a/emper/strategies/AbstractWorkStealingScheduler.cpp +++ b/emper/strategies/AbstractWorkStealingScheduler.cpp @@ -139,12 +139,10 @@ popTop: if constexpr (emper::IO_STEALING) { auto* victimIo = runtime.ioContexts[victim]; - if (victimIo->cqeCount()) { - fiber = victimIo->reapSingleCompletion<CallerEnvironment::EMPER>(); - if (fiber) { - emper::statsIncr(awss::stats.nextIoFiberStolen); - return std::make_pair(fiber, FiberSource::ioStolen); - } + fiber = victimIo->reapSingleCompletion<CallerEnvironment::EMPER>(); + if (fiber) { + emper::statsIncr(awss::stats.nextIoFiberStolen); + return std::make_pair(fiber, FiberSource::ioStolen); } }