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