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