diff --git a/emper/io/IoContext.cpp b/emper/io/IoContext.cpp index e28262b8fc12d4787b330e24ebd59603912b0550..d69e8d1054aefa6ab56d03672fde0b111b07f328 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);