diff --git a/emper/strategies/laws/LawsScheduler.cpp b/emper/strategies/laws/LawsScheduler.cpp index aa39a51480da9b7498416e8fbb054e0a48b4b9d7..138d9ef47a7f6c3016e44a02781bcbab66def4dc 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 43f7f12b2cf71ac7cc79ef6b319dc208e5a154cc..8f9c168288c1029435ccd936e7b4cc392f0b40a7 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: