diff --git a/ConflictSet.cpp b/ConflictSet.cpp index bf59121..4d581f8 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -4713,6 +4713,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { return; } + interleaved_insert::Result stackResults[100]; + #if __has_attribute(preserve_none) && __has_attribute(musttail) constexpr int kConcurrent = 16; interleaved_insert::Job inProgress[kConcurrent]; @@ -4721,8 +4723,12 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { context.count = count; context.root = root; context.writes = writes; - context.results = (interleaved_insert::Result *)safe_malloc( - sizeof(interleaved_insert::Result) * count); + context.results = stackResults; + if (count > int(sizeof(stackResults) / sizeof(stackResults[0]))) + [[unlikely]] { + context.results = (interleaved_insert::Result *)safe_malloc( + count * sizeof(interleaved_insert::Result)); + } int64_t started = std::min(kConcurrent, count); context.started = started; for (int i = 0; i < started; i++) { @@ -4755,7 +4761,11 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl { addPointWrite(getInTree(context.results[i].insertionPoint, this), context.results[i].remaining, writeVersion, &writeContext); } - safe_free(context.results, sizeof(interleaved_insert::Result) * count); + + if (count > int(sizeof(stackResults) / sizeof(stackResults[0]))) + [[unlikely]] { + safe_free(context.results, count * sizeof(interleaved_insert::Result)); + } } void addWrites(const WriteRange *writes, int count, int64_t writeVersion) {