From d875fdba482169d33efeb58a86ae6bb8de4c2285 Mon Sep 17 00:00:00 2001 From: Florian Schmaus <flow@cs.fau.de> Date: Thu, 24 Feb 2022 11:29:43 +0100 Subject: [PATCH] [Fibril] Check if pushing the continuation succeeded --- emper/Fibril.hpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/emper/Fibril.hpp b/emper/Fibril.hpp index 606ebd54..2be6c341 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...)); -- GitLab