diff --git a/emper/io/IoContext.cpp b/emper/io/IoContext.cpp index 8d8aaa31d303fdbb8f872ec3485f69911957195b..d1fec427ab31318cc87833f221ac57957fd929f0 100644 --- a/emper/io/IoContext.cpp +++ b/emper/io/IoContext.cpp @@ -168,11 +168,10 @@ auto IoContext::reapCompletions() -> std::vector<Fiber *> { uint32_t maxRaceFreeCompleterAttempts = 1; - using Completion = std::pair<uint32_t, TaggedPtr>; + using Completion = std::pair<uint32_t, void *>; // vector to store seen cqes to make the critical section // where cq_lock is held as small as possible - std::vector<Completion> reapedCompletions; - reapedCompletions.reserve(CQE_BATCH_COUNT); + std::array<Completion, CQE_BATCH_COUNT> reapedCompletions; // Vector returned containing all reaped completions in form of fibers. std::vector<Fiber *> continuationFibers; @@ -208,14 +207,10 @@ reap_cqes: for (unsigned i = 0; i < count; ++i) { struct io_uring_cqe *cqe = cqes[i]; void *cqe_data = io_uring_cqe_get_data(cqe); - TaggedPtr tptr(cqe_data); - - // Got a CQE for a forgotten Future - if (!tptr) { - continue; - } - reapedCompletions.emplace_back(cqe->res, tptr); + auto &reapedCompletion = reapedCompletions[i]; + reapedCompletion.first = cqe->res; + reapedCompletion.second = cqe_data; } io_uring_cq_advance(&ring, count); @@ -251,11 +246,18 @@ reap_cqes: stats.record_reaps<callerEnvironment>(count); - continuationFibers.reserve(reapedCompletions.size()); + continuationFibers.reserve(count); - for (auto &completion : reapedCompletions) { + for (unsigned i = 0; i < count; ++i) { + auto &completion = reapedCompletions[i]; auto res = completion.first; - auto tptr = completion.second; + auto *cqe_data = completion.second; + + TaggedPtr tptr(cqe_data); + // Got a CQE for a forgotten Future. + if (!tptr) { + continue; + } auto tag = static_cast<PointerTags>(tptr.getTag()); switch (tag) { @@ -305,7 +307,6 @@ reap_cqes: if (reReap) { // schedule all already collected continuation fibers runtime.schedule(continuationFibers.begin(), continuationFibers.end()); - reapedCompletions.clear(); continuationFibers.clear(); goto reap_cqes;