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