diff --git a/emper/Fibril.hpp b/emper/Fibril.hpp index 606ebd5484a056a8e955a5d5aef8c9b6494323c2..2be6c341da98978db544e6bfb31600aa30fa96b7 100644 --- a/emper/Fibril.hpp +++ b/emper/Fibril.hpp @@ -300,8 +300,10 @@ class Fibril : public AbstractFiber, public Logger<LogSubsystem::FIBRIL> { auto fork_func = [](ARGs... args, Fibril * fr, RET * ret, RET(*fun)(PARs...)) __attribute__((noinline, hot, optimize(3))) { fr->cont.ip = __builtin_return_address(0); - fr->runtime.scheduler.pushBottom(*fr); + bool pushed = fr->runtime.scheduler.pushBottom(*fr); *ret = fun(args...); + if (!pushed) [[unlikely]] + return; fr->checkContinuationState(); }; membar(fork_func(args..., this, ret, fun)); @@ -312,8 +314,10 @@ class Fibril : public AbstractFiber, public Logger<LogSubsystem::FIBRIL> { auto fork_func = [](ARGs... args, Fibril * fr, void (*fun)(PARs...)) __attribute__((noinline, hot, optimize(3))) { fr->cont.ip = __builtin_return_address(0); - fr->runtime.scheduler.pushBottom(*fr); + bool pushed = fr->runtime.scheduler.pushBottom(*fr); fun(args...); + if (!pushed) [[unlikely]] + return; fr->checkContinuationState(); }; membar(fork_func(args..., this, fun)); @@ -324,8 +328,10 @@ class Fibril : public AbstractFiber, public Logger<LogSubsystem::FIBRIL> { auto fork_func = [](Fibril * fr, std::function<T> fun, ARGs... args) __attribute__((noinline, hot, optimize(3))) { fr->cont.ip = __builtin_return_address(0); - fr->runtime.scheduler.pushBottom(*fr); + bool pushed = fr->runtime.scheduler.pushBottom(*fr); fun(args...); + if (!pushed) [[unlikely]] + return; fr->checkContinuationState(); }; membar(fork_func(this, fun, args...));