From a47be194c6b6b8b7804badd18d0c8b7910d6ac02 Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fl.fischer@fau.de>
Date: Wed, 9 Dec 2020 12:49:38 +0100
Subject: [PATCH] Allow an actor to be startet from anywhere

---
 emper/Actor.hpp | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/emper/Actor.hpp b/emper/Actor.hpp
index de36e9ac..3839a138 100644
--- a/emper/Actor.hpp
+++ b/emper/Actor.hpp
@@ -1,10 +1,11 @@
 // SPDX-License-Identifier: LGPL-3.0-or-later
-// Copyright © 2020 Florian Schmaus
+// Copyright © 2020 Florian Schmaus, Florian Fischer
 #pragma once
 
 #include <atomic>
 #include <chrono>
 
+#include "CallerEnvironment.hpp"
 #include "Fiber.hpp"
 #include "UnboundedBlockingMpscQueue.hpp"
 
@@ -55,13 +56,20 @@ class Actor {
 	void stop() { setState(Stopped); }
 
  public:
+	template <CallerEnvironment callerEnvironment = CallerEnvironment::EMPER>
 	void start() {
 		if (state.load(std::memory_order_acquire) != Stopped) return;
 
 		Fiber* actorFiber = Fiber::from(std::bind(&Actor::actorLoop, this));
-		runtime.schedule(*actorFiber);
+		if constexpr (callerEnvironment == CallerEnvironment::EMPER) {
+			runtime.schedule(*actorFiber);
+		} else {
+			runtime.scheduleFromAnywhere(*actorFiber);
+		}
 	}
 
+	void startFromAnywhere() { start<CallerEnvironment::ANYWHERE>(); }
+
 	void tell(T t) { queue.put(t); }
 
 	void tellFromAnywhere(T t) { queue.putFromAnywhere(t); }
-- 
GitLab