}
#define STATUS_VALID_BITS \
- (STATUS_TERMINATED | STATUS_EXHAUSTED | STATUS_DELAY_DIRTY)
+ (STATUS_TERMINATED | STATUS_EXHAUSTED | STATUS_DELAY_DIRTY | STATUS_ERROR)
/** \brief Retrieve status bitmask from stream state. */
static really_inline
}
done_scan:
- if (told_to_stop_matching(scratch)) {
+ if (unlikely(internal_matching_error(scratch))) {
+ unmarkScratchInUse(scratch);
+ return HS_UNKNOWN_ERROR;
+ } else if (told_to_stop_matching(scratch)) {
unmarkScratchInUse(scratch);
return HS_SCAN_TERMINATED;
}
}
set_retval:
+ if (unlikely(internal_matching_error(scratch))) {
+ unmarkScratchInUse(scratch);
+ return HS_UNKNOWN_ERROR;
+ }
+
if (rose->flushCombProgramOffset) {
if (roseRunFlushCombProgram(rose, scratch, ~0ULL) == MO_HALT_MATCHING) {
unmarkScratchInUse(scratch);
char *state = getMultiState(id);
u8 status = getStreamStatus(state);
- if (status & (STATUS_TERMINATED | STATUS_EXHAUSTED)) {
+ if (status & (STATUS_TERMINATED | STATUS_EXHAUSTED | STATUS_ERROR)) {
DEBUG_PRINTF("stream is broken, just freeing storage\n");
return;
}
}
report_eod_matches(to_id, scratch, onEvent, context);
unmarkScratchInUse(scratch);
+ if (unlikely(internal_matching_error(scratch))) {
+ return HS_UNKNOWN_ERROR;
+ }
}
size_t stateSize
char *state = getMultiState(id);
u8 status = getStreamStatus(state);
- if (status & (STATUS_TERMINATED | STATUS_EXHAUSTED)) {
+ if (status & (STATUS_TERMINATED | STATUS_EXHAUSTED | STATUS_ERROR)) {
DEBUG_PRINTF("stream is broken, halting scan\n");
- if (status & STATUS_TERMINATED) {
+ if (status & STATUS_ERROR) {
+ return HS_UNKNOWN_ERROR;
+ } else if (status & STATUS_TERMINATED) {
return HS_SCAN_TERMINATED;
} else {
return HS_SUCCESS;
setStreamStatus(state, scratch->core_info.status);
- if (likely(!can_stop_matching(scratch))) {
+ if (unlikely(internal_matching_error(scratch))) {
+ return HS_UNKNOWN_ERROR;
+ } else if (likely(!can_stop_matching(scratch))) {
maintainHistoryBuffer(rose, state, data, length);
id->offset += length; /* maintain offset */
}
report_eod_matches(id, scratch, onEvent, context);
unmarkScratchInUse(scratch);
+ if (unlikely(internal_matching_error(scratch))) {
+ return HS_UNKNOWN_ERROR;
+ }
}
if (id->rose->flushCombProgramOffset && !told_to_stop_matching(scratch)) {
}
report_eod_matches(id, scratch, onEvent, context);
unmarkScratchInUse(scratch);
+ if (unlikely(internal_matching_error(scratch))) {
+ return HS_UNKNOWN_ERROR;
+ }
}
if (id->rose->flushCombProgramOffset && !told_to_stop_matching(scratch)) {
if (onEvent) {
report_eod_matches(id, scratch, onEvent, context);
- if (told_to_stop_matching(scratch)) {
+ if (unlikely(internal_matching_error(scratch))) {
+ unmarkScratchInUse(scratch);
+ return HS_UNKNOWN_ERROR;
+ } else if (told_to_stop_matching(scratch)) {
unmarkScratchInUse(scratch);
return HS_SCAN_TERMINATED;
}
}
report_eod_matches(to_stream, scratch, onEvent, context);
unmarkScratchInUse(scratch);
+ if (unlikely(internal_matching_error(scratch))) {
+ return HS_UNKNOWN_ERROR;
+ }
}
if (expand_stream(to_stream, rose, buf, buf_size)) {