From 7ad1badac9fba9286aaee0a1e90b6b3c8d32da9d Mon Sep 17 00:00:00 2001 From: Florian Schmaus <flow@cs.fau.de> Date: Mon, 8 Mar 2021 19:53:48 +0100 Subject: [PATCH] [IO] Use std::array for reapedCompletions Probably avoids dynamic memory allocation done by the previously used std::vector. --- emper/io/IoContext.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/emper/io/IoContext.cpp b/emper/io/IoContext.cpp index 8d8aaa31..d1fec427 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; -- GitLab