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