From 1d164e8180afbc9c964989d6c80d28180ce0da72 Mon Sep 17 00:00:00 2001
From: Florian Fischer <florian.fischer@muhq.space>
Date: Sat, 19 Feb 2022 13:55:11 +0100
Subject: [PATCH] do not define futex_waitv if already done in linux/futex.h

---
 emper/lib/sync/SpuriousFutex2Semaphore.cpp | 8 ++++++--
 emper/lib/sync/meson.build                 | 5 +++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/emper/lib/sync/SpuriousFutex2Semaphore.cpp b/emper/lib/sync/SpuriousFutex2Semaphore.cpp
index 41abdc8b..72ffa390 100644
--- a/emper/lib/sync/SpuriousFutex2Semaphore.cpp
+++ b/emper/lib/sync/SpuriousFutex2Semaphore.cpp
@@ -10,6 +10,7 @@
 #include <cerrno>
 
 #include "Worker.hpp"
+#include "emper-config.h"
 
 #ifndef SYS_futex_waitv
 #define SYS_futex_waitv 449
@@ -19,18 +20,21 @@
 #define FUTEX_32 2
 #endif
 
+#ifdef EMPER_DEFINE_FUTEX_WAITV
 struct futex_waitv {
 	uint64_t val;
 	uint64_t uaddr;
 	uint32_t flags;
-	uint32_t _reserved;
+	// NOLINTNEXTLINE(bugprone-reserved-identifier)
+	uint32_t __reserved;
 };
+#endif
 
 static void init_futex_waitv(struct futex_waitv* waiter, uint64_t val, void* uaddr) {
 	waiter->val = val;
 	waiter->uaddr = reinterpret_cast<uintptr_t>(uaddr);
 	waiter->flags = FUTEX_PRIVATE_FLAG | FUTEX_32;
-	waiter->_reserved = 0;
+	waiter->__reserved = 0;
 }
 
 namespace emper::lib::sync {
diff --git a/emper/lib/sync/meson.build b/emper/lib/sync/meson.build
index c4476cae..8e4cd142 100644
--- a/emper/lib/sync/meson.build
+++ b/emper/lib/sync/meson.build
@@ -1,3 +1,8 @@
+if not cpp_compiler.has_member('struct futex_waitv', 'val',
+                               prefix: '#include <linux/futex.h>')
+	conf_data.set('EMPER_DEFINE_FUTEX_WAITV', true)
+endif
+
 emper_cpp_sources += files(
   'SpuriousFutex2Semaphore.cpp',
 )
-- 
GitLab