From 4a482b07ea65ef9b64c1351af6b853210f1637f0 Mon Sep 17 00:00:00 2001 From: Alex Coyte Date: Mon, 7 Mar 2016 14:48:01 +1100 Subject: [PATCH] UE-2919: add termination checks around handleReportInternally --- src/rose/catchup.c | 8 ++++++-- src/rose/catchup.h | 2 ++ src/rose/match.c | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/rose/catchup.c b/src/rose/catchup.c index 40327350..11178675 100644 --- a/src/rose/catchup.c +++ b/src/rose/catchup.c @@ -488,7 +488,8 @@ int roseNfaBlastAdaptor(u64a offset, ReportID id, void *context) { offset, id); if (handleReportInternally(t, scratch, id, offset)) { - return MO_CONTINUE_MATCHING; + return can_stop_matching(scratch) ? MO_HALT_MATCHING + : MO_CONTINUE_MATCHING; } updateLastMatchOffset(tctxt, offset); @@ -626,7 +627,8 @@ int roseNfaAdaptor(u64a offset, ReportID id, void *context) { const struct RoseEngine *t = scratch->core_info.rose; if (handleReportInternally(t, scratch, id, offset)) { - return MO_CONTINUE_MATCHING; + return can_stop_matching(scratch) ? MO_HALT_MATCHING + : MO_CONTINUE_MATCHING; } return tctxt->cb(offset, id, scratch); @@ -905,6 +907,7 @@ hwlmcb_rv_t buildSufPQ(const struct RoseEngine *t, char *state, s64a safe_loc, hwlmcb_rv_t rv = roseCatchUpMPV(t, report_ok_loc, scratch); if (rv != HWLM_CONTINUE_MATCHING) { + DEBUG_PRINTF("terminating...\n"); return rv; } @@ -1060,6 +1063,7 @@ hwlmcb_rv_t roseCatchUpAll(s64a loc, struct hs_scratch *scratch) { rv = roseCatchUpMPV(t, loc, scratch); assert(rv != HWLM_CONTINUE_MATCHING || scratch->catchup_pq.qm_size <= t->outfixEndQueue); + assert(!can_stop_matching(scratch) || rv == HWLM_TERMINATE_MATCHING); return rv; } diff --git a/src/rose/catchup.h b/src/rose/catchup.h index 910aa8da..692b184b 100644 --- a/src/rose/catchup.h +++ b/src/rose/catchup.h @@ -105,6 +105,7 @@ hwlmcb_rv_t roseCatchUpMPV(const struct RoseEngine *t, s64a loc, struct hs_scratch *scratch) { u64a cur_offset = loc + scratch->core_info.buf_offset; assert(cur_offset >= scratch->tctxt.minMatchOffset); + assert(!can_stop_matching(scratch)); if (canSkipCatchUpMPV(t, scratch, cur_offset)) { updateMinMatchOffsetFromMpv(&scratch->tctxt, cur_offset); @@ -151,6 +152,7 @@ hwlmcb_rv_t roseCatchUpTo(const struct RoseEngine *t, || scratch->tctxt.minMatchOffset == end); assert(rv != HWLM_CONTINUE_MATCHING || scratch->tctxt.minNonMpvMatchOffset == end); + assert(!can_stop_matching(scratch) || rv == HWLM_TERMINATE_MATCHING); return rv; } diff --git a/src/rose/match.c b/src/rose/match.c index 9ff7db06..96f09028 100644 --- a/src/rose/match.c +++ b/src/rose/match.c @@ -184,6 +184,7 @@ hwlmcb_rv_t roseHandleChainMatch(const struct RoseEngine *t, * be known to be consistent */ if (ensureMpvQueueFlushed(t, scratch, qi, loc, in_catchup) == HWLM_TERMINATE_MATCHING) { + DEBUG_PRINTF("terminating...\n"); return HWLM_TERMINATE_MATCHING; } }