diff --git a/ConflictSet.cpp b/ConflictSet.cpp index c37be0f..08a4b23 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -2671,19 +2671,7 @@ downLeftSpine: bool finishCheckRangeRead(int lcp, Node *n, std::span begin, std::span end, - std::span commonPrefixRemaining, InternalVersionT readVersion, ReadContext *tls) { - Arena arena; - assert(getSearchPath(arena, n) <=> - begin.subspan(0, lcp - commonPrefixRemaining.size()) == - 0); - - const int consumed = lcp - commonPrefixRemaining.size(); - assume(consumed >= 0); - - begin = begin.subspan(consumed, int(begin.size()) - consumed); - end = end.subspan(consumed, int(end.size()) - consumed); - lcp -= consumed; if (lcp == int(begin.size())) { return checkRangeRightSide(n, end, lcp, readVersion, tls); @@ -3376,7 +3364,7 @@ FLATTEN PRESERVE_NONE void begin(CheckJob *, CheckContext *); template FLATTEN PRESERVE_NONE void common_prefix_iter(CheckJob *, CheckContext *); -FLATTEN PRESERVE_NONE void down_left_spine(CheckJob *, CheckContext *); +FLATTEN PRESERVE_NONE void done_common_prefix_iter(CheckJob *, CheckContext *); static Continuation commonPrefixIterTable[] = { common_prefix_iter, common_prefix_iter, @@ -3404,23 +3392,13 @@ FLATTEN PRESERVE_NONE void begin(CheckJob *job, CheckContext *context) { job->commonPrefixRemaining = job->begin.subspan(0, job->lcp); if (job->commonPrefixRemaining.size() == 0) { - *job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end, - job->commonPrefixRemaining, - job->readVersion, context->tls) - ? ConflictSet::Commit - : ConflictSet::Conflict; - MUSTTAIL return complete(job, context); + MUSTTAIL return done_common_prefix_iter(job, context); } auto c = getChild(job->n, job->commonPrefixRemaining[0]); job->child = c; if (job->child == nullptr) { - *job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end, - job->commonPrefixRemaining, - job->readVersion, context->tls) - ? ConflictSet::Commit - : ConflictSet::Conflict; - MUSTTAIL return complete(job, context); + MUSTTAIL return done_common_prefix_iter(job, context); } job->continuation = commonPrefixIterTable[c.getType()]; @@ -3441,12 +3419,7 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) { int i = longestCommonPrefix(child->partialKey(), job->commonPrefixRemaining.data() + 1, cl); if (i != child->partialKeyLen) { - *job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, - job->end, job->commonPrefixRemaining, - job->readVersion, context->tls) - ? ConflictSet::Commit - : ConflictSet::Conflict; - MUSTTAIL return complete(job, context); + MUSTTAIL return done_common_prefix_iter(job, context); } } job->n = job->child; @@ -3457,23 +3430,13 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) { ++context->tls->range_read_iterations_accum; if (job->commonPrefixRemaining.size() == 0) { - *job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end, - job->commonPrefixRemaining, - job->readVersion, context->tls) - ? ConflictSet::Commit - : ConflictSet::Conflict; - MUSTTAIL return complete(job, context); + MUSTTAIL return done_common_prefix_iter(job, context); } auto c = getChild(job->n, job->commonPrefixRemaining[0]); job->child = c; if (job->child == nullptr) { - *job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end, - job->commonPrefixRemaining, - job->readVersion, context->tls) - ? ConflictSet::Commit - : ConflictSet::Conflict; - MUSTTAIL return complete(job, context); + MUSTTAIL return done_common_prefix_iter(job, context); } job->continuation = commonPrefixIterTable[c.getType()]; @@ -3481,6 +3444,31 @@ void common_prefix_iter(CheckJob *job, CheckContext *context) { MUSTTAIL return keepGoing(job, context); } +FLATTEN PRESERVE_NONE void done_common_prefix_iter(CheckJob *job, + CheckContext *context) { + + { + Arena arena; + assert(getSearchPath(arena, job->n) <=> + job->begin.subspan(0, job->lcp - + job->commonPrefixRemaining.size()) == + 0); + } + + const int consumed = job->lcp - job->commonPrefixRemaining.size(); + assume(consumed >= 0); + + job->begin = job->begin.subspan(consumed, int(job->begin.size()) - consumed); + job->end = job->end.subspan(consumed, int(job->end.size()) - consumed); + job->lcp -= consumed; + + *job->result = finishCheckRangeRead(job->lcp, job->n, job->begin, job->end, + job->readVersion, context->tls) + ? ConflictSet::Commit + : ConflictSet::Conflict; + MUSTTAIL return complete(job, context); +} + } // namespace check_range_read_state_machine void CheckJob::init(const ConflictSet::ReadRange *read,