From b37feb58dd2b1e9fe3ebd455aa74c0e9adb2997a Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Mon, 11 Nov 2024 21:40:05 -0800 Subject: [PATCH] Require musttail and preserve_none for interleaved --- ConflictSet.cpp | 88 ++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/ConflictSet.cpp b/ConflictSet.cpp index b82e748..9a80685 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -3183,6 +3183,12 @@ Node *firstGeqPhysical(Node *n, const TrivialSpan key) { #define PRESERVE_NONE #endif +#if __has_attribute(musttail) && __has_attribute(preserve_none) +constexpr bool kEnableInterleaved = true; +#else +constexpr bool kEnableInterleaved = false; +#endif + namespace check { typedef PRESERVE_NONE void (*Continuation)(struct Job *, struct Context *); @@ -4969,51 +4975,50 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { check::Context context; context.readContext.impl = this; -#if __has_attribute(musttail) - if (count == 1) { - useSequential(reads, result, count, context); - } else { - constexpr int kConcurrent = 16; - check::Job inProgress[kConcurrent]; - context.count = count; - context.oldestVersionFullPrecision = oldestVersionFullPrecision; - context.root = root; - context.queries = reads; - context.results = result; - int64_t started = std::min(kConcurrent, count); - context.started = started; - for (int i = 0; i < started; i++) { - inProgress[i].init(reads + i, result + i, root, - oldestVersionFullPrecision); - } - for (int i = 0; i < started - 1; i++) { - inProgress[i].next = inProgress + i + 1; - } - for (int i = 1; i < started; i++) { - inProgress[i].prev = inProgress + i - 1; - } - inProgress[0].prev = inProgress + started - 1; - inProgress[started - 1].next = inProgress; + if constexpr (kEnableInterleaved) { + if (count == 1) { + useSequential(reads, result, count, context); + } else { + constexpr int kConcurrent = 16; + check::Job inProgress[kConcurrent]; + context.count = count; + context.oldestVersionFullPrecision = oldestVersionFullPrecision; + context.root = root; + context.queries = reads; + context.results = result; + int64_t started = std::min(kConcurrent, count); + context.started = started; + for (int i = 0; i < started; i++) { + inProgress[i].init(reads + i, result + i, root, + oldestVersionFullPrecision); + } + for (int i = 0; i < started - 1; i++) { + inProgress[i].next = inProgress + i + 1; + } + for (int i = 1; i < started; i++) { + inProgress[i].prev = inProgress + i - 1; + } + inProgress[0].prev = inProgress + started - 1; + inProgress[started - 1].next = inProgress; - // Kick off the sequence of tail calls that finally returns once all jobs - // are done - inProgress->continuation(inProgress, &context); + // Kick off the sequence of tail calls that finally returns once all + // jobs are done + inProgress->continuation(inProgress, &context); #ifndef NDEBUG - Arena arena; - auto *results2 = new (arena) Result[count]; - check::Context context2; - context2.readContext.impl = this; - useSequential(reads, results2, count, context2); - assert(memcmp(result, results2, count) == 0); - assert(context.readContext == context2.readContext); + Arena arena; + auto *results2 = new (arena) Result[count]; + check::Context context2; + context2.readContext.impl = this; + useSequential(reads, results2, count, context2); + assert(memcmp(result, results2, count) == 0); + assert(context.readContext == context2.readContext); #endif + } + } else { + useSequential(reads, result, count, context); } -#else - useSequential(reads, result, count, context); -#endif - for (int i = 0; i < count; ++i) { assert(reads[i].readVersion >= 0); assert(reads[i].readVersion <= newestVersionFullPrecision); @@ -5186,11 +5191,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { assert(allPointWrites || sorted); #endif -#if __has_attribute(musttail) - constexpr bool kEnableInterleaved = true; -#else - constexpr bool kEnableInterleaved = false; -#endif if (kEnableInterleaved && count > 1) { interleavedWrites(writes, count, InternalVersionT(writeVersion)); } else {