diff --git a/emper/Runtime.hpp b/emper/Runtime.hpp index 96931f39828ca04c639d00dbf2c76d5170184dd9..c8a4bbadec6c95910bc1b100a6b8c43115af61af 100644 --- a/emper/Runtime.hpp +++ b/emper/Runtime.hpp @@ -5,7 +5,6 @@ #include <pthread.h> // for pthread_t #include <atomic> -#include <cassert> // for assert #include <cstdint> // for intptr_t #include <cstdlib> // for abort #include <functional> // for function @@ -76,7 +75,11 @@ class Runtime : public Logger<LogSubsystem::RUNTI> { Latch secondWorkerThreadExitLatch; RuntimeStrategy* const strategy; + + public: Scheduler& scheduler; + + private: Dispatcher& dispatcher; ContextManager& contextManager; pthread_t* threads; @@ -176,19 +179,9 @@ class Runtime : public Logger<LogSubsystem::RUNTI> { ~Runtime(); - inline void schedule(Fiber& fiber) { - // Calling schedule() only works from within the EMPER runtime. - assert(inRuntime()); + inline void schedule(Fiber& fiber) { scheduler.schedule(fiber); } - scheduler.schedule(fiber); - } - - inline void schedule(Fiber** fibers, unsigned count) { - // Calling schedule() only works from within the EMPER runtime. - assert(inRuntime()); - - scheduler.schedule(fibers, count); - } + inline void schedule(Fiber** fibers, unsigned count) { scheduler.schedule(fibers, count); } inline void scheduleFromAnywhere(Fiber& fiber) { scheduler.scheduleFromAnywhere(fiber); } @@ -228,8 +221,6 @@ class Runtime : public Logger<LogSubsystem::RUNTI> { void printStats(std::ostream& out = std::cout, bool detailed = false); - static auto inRuntime() -> bool { return Worker::isWorkerThread(); } - void executeAndWait(std::function<void()> f); friend class AbstractWorkStealingScheduler; diff --git a/emper/Scheduler.hpp b/emper/Scheduler.hpp index 41160ff3612910003f03836a9a5dd3f4d16396f5..be9e9a0779b8ba8a8a2a48066212f32748448c91 100644 --- a/emper/Scheduler.hpp +++ b/emper/Scheduler.hpp @@ -73,14 +73,24 @@ class Scheduler : public Logger<LogSubsystem::SCHED> { void recycle(Fiber* fiber) { dispatcher.recycle(fiber); }; + virtual auto nextFiber() -> NextFiberResult = 0; + + friend class Runtime; + public: void schedule(Fiber& fiber) { + // Calling schedule() only works from within the EMPER runtime. + emper::assertInRuntime(); + LOGD("Scheduling fiber " << &fiber); scheduleInternal(fiber); } // TODO: maybe this should also be a specialized function void schedule(Fiber** fibers, unsigned count) { + // Calling schedule() only works from within the EMPER runtime. + emper::assertInRuntime(); + for (unsigned i = 0; i < count; ++i) { Fiber& fiber = *fibers[i]; LOGD("Scheduling batched fiber " << &fiber); @@ -88,8 +98,6 @@ class Scheduler : public Logger<LogSubsystem::SCHED> { } } - virtual auto nextFiber() -> NextFiberResult = 0; - void scheduleFromAnywhere(Fiber& fiber) { LOGD("Scheduling fiber " << &fiber << " from anywhere"); scheduleFromAnywhereInternal(fiber);