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