Use stack allocation for small counts
This commit is contained in:
@@ -4713,6 +4713,8 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interleaved_insert::Result stackResults[100];
|
||||||
|
|
||||||
#if __has_attribute(preserve_none) && __has_attribute(musttail)
|
#if __has_attribute(preserve_none) && __has_attribute(musttail)
|
||||||
constexpr int kConcurrent = 16;
|
constexpr int kConcurrent = 16;
|
||||||
interleaved_insert::Job inProgress[kConcurrent];
|
interleaved_insert::Job inProgress[kConcurrent];
|
||||||
@@ -4721,8 +4723,12 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
context.count = count;
|
context.count = count;
|
||||||
context.root = root;
|
context.root = root;
|
||||||
context.writes = writes;
|
context.writes = writes;
|
||||||
context.results = (interleaved_insert::Result *)safe_malloc(
|
context.results = stackResults;
|
||||||
sizeof(interleaved_insert::Result) * count);
|
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);
|
int64_t started = std::min(kConcurrent, count);
|
||||||
context.started = started;
|
context.started = started;
|
||||||
for (int i = 0; i < started; i++) {
|
for (int i = 0; i < started; i++) {
|
||||||
@@ -4755,7 +4761,11 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
addPointWrite(getInTree(context.results[i].insertionPoint, this),
|
addPointWrite(getInTree(context.results[i].insertionPoint, this),
|
||||||
context.results[i].remaining, writeVersion, &writeContext);
|
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) {
|
void addWrites(const WriteRange *writes, int count, int64_t writeVersion) {
|
||||||
|
Reference in New Issue
Block a user