From 86c22b376135f92c0f70a004ac518db71b4fd8dd Mon Sep 17 00:00:00 2001
From: Florian Schmaus <flow@cs.fau.de>
Date: Wed, 3 Feb 2021 21:07:03 +0100
Subject: [PATCH] [IoContext] Add castIfIoFuture() helper function

---
 emper/io/IoContext.cpp | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/emper/io/IoContext.cpp b/emper/io/IoContext.cpp
index e28262b8..d69e8d10 100644
--- a/emper/io/IoContext.cpp
+++ b/emper/io/IoContext.cpp
@@ -31,13 +31,20 @@
 static const uintptr_t IOCONTEXT_TAG = 1L << (sizeof(size_t) * 8 - 1);
 static const uintptr_t IOCONTEXT_TAG_MASK = IOCONTEXT_TAG - 1;
 
-static inline auto isIoContext(uintptr_t ptr) -> bool { return (ptr & IOCONTEXT_TAG) != 0; }
+namespace emper::io {
+
+static inline auto castIfIoFuture(uintptr_t ptr) -> Future * {
+	if (ptr & IOCONTEXT_TAG) {
+		return nullptr;
+	}
+
+	return reinterpret_cast<Future *>(ptr);
+}
 
 static inline auto stripIoContextTag(uintptr_t ptr) -> IoContext * {
 	return reinterpret_cast<IoContext *>(ptr & IOCONTEXT_TAG_MASK);
 }
 
-namespace emper::io {
 thread_local IoContext *IoContext::workerIo = nullptr;
 
 pthread_t IoContext::globalCompleter;
@@ -258,9 +265,8 @@ auto IoContext::globalCompleterFunc(void *arg) -> void * {
 		auto data = (uintptr_t)io_uring_cqe_get_data(cqe);
 
 		// The cqe is for a completed Future
-		if (unlikely(!isIoContext(data))) {
-			auto *future = reinterpret_cast<Future *>(data);
-
+		auto *future = castIfIoFuture(data);
+		if (unlikely(future)) {
 			uint32_t res = cqe->res;
 			io_uring_cqe_seen(&io.ring, cqe);
 
-- 
GitLab