From 28ea72ef3b4a24edfc6d0d7af9daf81671304d3b Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fl.fischer@fau.de>
Date: Mon, 23 Nov 2020 10:39:51 +0100
Subject: [PATCH] [userspace-rcu] make the userspace-rcu dependecy optional

Disable the userpace-rcu support by default.
Our used userspace-rcu flavor memb is rather new and not available in
liburcu version 0.10 available in debian buster.
This change switches from using DCE and "if constexpr" to the C
preprocessor so the library is only needed when the userspace-rcu support
is actually enabled.
---
 emper/Runtime.cpp | 12 ++++++++----
 meson.build       | 11 ++++++++---
 meson_options.txt |  2 +-
 tests/meson.build |  4 ++--
 4 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/emper/Runtime.cpp b/emper/Runtime.cpp
index 2cc9e480..93528d5d 100644
--- a/emper/Runtime.cpp
+++ b/emper/Runtime.cpp
@@ -8,7 +8,6 @@
 // Non portable.
 #include <sched.h>				// for cpu_set_t, CPU_SET, CPU_ZERO
 #include <sys/sysinfo.h>	// for get_nprocs
-#include <urcu.h>					// for rcu_register_thread
 
 #include <cstdlib>	// for rand, srand, abort
 #include <cstring>
@@ -23,9 +22,14 @@
 #include "Fiber.hpp"								 // for Fiber
 #include "RuntimeStrategy.hpp"			 // for RuntimeStrategy
 #include "RuntimeStrategyStats.hpp"	 // for RuntimeStrategyStats
+#include "emper-config.h"						 // IWYU pragma: keep
 #include "lib/DebugUtil.hpp"
 #include "strategies/ws/WsStrategy.hpp"	 // for WsStrategy, WsStrategy::INST...
 
+#ifdef EMPER_LIBURCU
+#include <urcu.h>	 // for rcu_register_thread
+#endif
+
 #ifndef NDEBUG
 #include <syscall.h>	// for SYS_gettid
 #include <unistd.h>		// for syscall
@@ -79,9 +83,9 @@ Runtime::Runtime(workerid_t workerCount, RuntimeStrategy& strategy, unsigned int
 		workerIds[i] = i;
 
 		auto thread_function = [](void* voidWorkerId) -> void* {
-			if constexpr (emper::LIBURCU) {
-				rcu_register_thread();
-			}
+#ifdef EMPER_LIBURCU
+			rcu_register_thread();
+#endif
 
 			return currentRuntime->workerLoop(voidWorkerId);
 		};
diff --git a/meson.build b/meson.build
index 6c2c21e5..7e7331d0 100644
--- a/meson.build
+++ b/meson.build
@@ -12,14 +12,19 @@ project('EMPER', 'c', 'cpp',
 add_project_arguments('-Wno-non-virtual-dtor', language: 'cpp')
 
 thread_dep = dependency('threads')
-liburcu_dep = dependency('liburcu')
-emper_dependencies = [thread_dep, liburcu_dep]
+emper_dependencies = [thread_dep]
 
 run_target('iwyu',
 		   command: 'tools/check-iwyu')
 
 conf_data = configuration_data()
-conf_data.set('EMPER_LIBURCU', get_option('userspace-rcu'))
+option_urcu = get_option('userspace-rcu')
+conf_data.set('EMPER_LIBURCU', option_urcu)
+if option_urcu
+	liburcu_dep = dependency('liburcu')
+	emper_dependencies += [liburcu_dep]
+endif
+
 conf_data.set('EMPER_WORKER_SLEEP', get_option('worker_sleep'))
 conf_data.set('EMPER_LOCKED_WS_QUEUE', get_option('locked_ws_queue'))
 conf_data.set('EMPER_OVERFLOW_QUEUE', get_option('overflow_queue'))
diff --git a/meson_options.txt b/meson_options.txt
index 8032e30c..98390462 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,7 +1,7 @@
 option(
   'userspace-rcu',
   type: 'boolean',
-  value: true,
+  value: false,
   description: 'Allow EMPER fibers to use userspace RCU',
 )
 option(
diff --git a/tests/meson.build b/tests/meson.build
index 43651403..f2c0134f 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -1,6 +1,6 @@
 cc = meson.get_compiler('c')
-liburcu_memb = cc.find_library('urcu-memb')
-liburcu_cds = cc.find_library('urcu-cds')
+liburcu_memb = option_urcu ? cc.find_library('urcu-memb') : disabler()
+liburcu_cds = option_urcu ? cc.find_library('urcu-cds') : disabler()
 
 tests = {
 		  'SimpleFibTest.cpp':
-- 
GitLab