From 1c16998a73500bcd9e9ae441ace7cc8d0d820932 Mon Sep 17 00:00:00 2001 From: Florian Schmaus <flow@cs.fau.de> Date: Wed, 5 May 2021 16:20:14 +0200 Subject: [PATCH] [LawsScheduler] Guard Runtime::getWorkerId() with CallerEnvironment Calling Runtime::getWorkerId() is only possible from within the runtime, hence guard the call with CallerEnvironment. --- emper/strategies/laws/LawsScheduler.cpp | 16 ++++++++++------ emper/strategies/laws/LawsScheduler.hpp | 2 ++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/emper/strategies/laws/LawsScheduler.cpp b/emper/strategies/laws/LawsScheduler.cpp index aa39a514..138d9ef4 100644 --- a/emper/strategies/laws/LawsScheduler.cpp +++ b/emper/strategies/laws/LawsScheduler.cpp @@ -22,6 +22,7 @@ LawsScheduler::LawsScheduler(Runtime& runtime) : AbstractWorkStealingScheduler(r addNewWorkerHook(newWorkerHook); } +template <CallerEnvironment callerEnvironment> void LawsScheduler::tryScheduleToPriorityQueue(Fiber& fiber) { workeraffinity_t* const affinity_buffer = getAffinityBuffer(fiber); if (!affinity_buffer) { @@ -29,9 +30,12 @@ void LawsScheduler::tryScheduleToPriorityQueue(Fiber& fiber) { } workeraffinity_t affinity = *affinity_buffer; - workerid_t workerId = Runtime::getWorkerId(); - if (affinity == workerId) { - return; + + if constexpr (callerEnvironment == CallerEnvironment::EMPER) { + workerid_t workerId = Runtime::getWorkerId(); + if (affinity == workerId) { + return; + } } if (affinity == Fiber::NOT_AFFINE) { @@ -46,12 +50,12 @@ void LawsScheduler::tryScheduleToPriorityQueue(Fiber& fiber) { } void LawsScheduler::scheduleInternal(Fiber& fiber) { - tryScheduleToPriorityQueue(fiber); + tryScheduleToPriorityQueue<CallerEnvironment::EMPER>(fiber); scheduleViaWorkStealing(fiber); } void LawsScheduler::scheduleFromAnywhereInternal(Fiber& fiber) { - tryScheduleToPriorityQueue(fiber); + tryScheduleToPriorityQueue<CallerEnvironment::ANYWHERE>(fiber); enqueueInAnywhereQueue(fiber); onNewWork<CallerEnvironment::ANYWHERE>(); } @@ -59,7 +63,7 @@ void LawsScheduler::scheduleFromAnywhereInternal(Fiber& fiber) { void LawsScheduler::scheduleFromAnywhereInternal(Fiber** fibers, unsigned count) { for (unsigned i = 0; i < count; ++i) { Fiber& fiber = *fibers[i]; - tryScheduleToPriorityQueue(fiber); + tryScheduleToPriorityQueue<CallerEnvironment::ANYWHERE>(fiber); } insertInAnywhereQueue(fibers, count); onNewWork<CallerEnvironment::ANYWHERE>(); diff --git a/emper/strategies/laws/LawsScheduler.hpp b/emper/strategies/laws/LawsScheduler.hpp index 43f7f12b..8f9c1682 100644 --- a/emper/strategies/laws/LawsScheduler.hpp +++ b/emper/strategies/laws/LawsScheduler.hpp @@ -2,6 +2,7 @@ // Copyright © 2020-2021 Florian Schmaus #pragma once +#include "CallerEnvironment.hpp" #include "Fiber.hpp" #include "lib/adt/MpscQueue.hpp" #include "strategies/AbstractWorkStealingScheduler.hpp" @@ -17,6 +18,7 @@ class LawsScheduler : public AbstractWorkStealingScheduler { static thread_local LawsMpscQueue priorityQueue; + template <CallerEnvironment callerEnvironment> void tryScheduleToPriorityQueue(Fiber& fiber); protected: -- GitLab