threading: optimize error handling in main packet loop

pull/4531/head
Victor Julien 7 years ago
parent 9d8ea3b4fe
commit 85cf341189

@ -148,66 +148,58 @@ TmSlot *TmThreadGetFirstTmSlotForPartialPattern(const char *);
uint32_t TmThreadCountThreadsByTmmFlags(uint8_t flags); uint32_t TmThreadCountThreadsByTmmFlags(uint8_t flags);
static inline void TmThreadsSlotProcessPktFail(ThreadVars *tv, TmSlot *s, Packet *p)
{
TmqhOutputPacketpool(tv, p);
for (TmSlot *slot = s; slot != NULL; slot = slot->slot_next) {
SCMutexLock(&slot->slot_post_pq.mutex_q);
TmqhReleasePacketsToPacketPool(&slot->slot_post_pq);
SCMutexUnlock(&slot->slot_post_pq.mutex_q);
}
TmThreadsSetFlag(tv, THV_FAILED);
}
/** /**
* \brief Process the rest of the functions (if any) and queue. * \brief Process the rest of the functions (if any) and queue.
*/ */
static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet *p) static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet *p)
{ {
TmEcode r = TM_ECODE_OK;
if (s == NULL) { if (s == NULL) {
tv->tmqh_out(tv, p); tv->tmqh_out(tv, p);
return r; return TM_ECODE_OK;
} }
if (TmThreadsSlotVarRun(tv, p, s) == TM_ECODE_FAILED) { TmEcode r = TmThreadsSlotVarRun(tv, p, s);
TmqhOutputPacketpool(tv, p); if (unlikely(r == TM_ECODE_FAILED)) {
TmSlot *slot = s; TmThreadsSlotProcessPktFail(tv, s, p);
while (slot != NULL) { return TM_ECODE_FAILED;
SCMutexLock(&slot->slot_post_pq.mutex_q); }
TmqhReleasePacketsToPacketPool(&slot->slot_post_pq);
SCMutexUnlock(&slot->slot_post_pq.mutex_q);
slot = slot->slot_next; tv->tmqh_out(tv, p);
}
TmThreadsSetFlag(tv, THV_FAILED);
r = TM_ECODE_FAILED;
} else { /* post process pq */
tv->tmqh_out(tv, p); for (TmSlot *slot = s; slot != NULL; slot = slot->slot_next) {
if (slot->slot_post_pq.top != NULL) {
while (1) {
SCMutexLock(&slot->slot_post_pq.mutex_q);
Packet *extra_p = PacketDequeue(&slot->slot_post_pq);
SCMutexUnlock(&slot->slot_post_pq.mutex_q);
/* post process pq */ if (extra_p == NULL)
TmSlot *slot = s; break;
while (slot != NULL) {
if (slot->slot_post_pq.top != NULL) {
while (1) {
SCMutexLock(&slot->slot_post_pq.mutex_q);
Packet *extra_p = PacketDequeue(&slot->slot_post_pq);
SCMutexUnlock(&slot->slot_post_pq.mutex_q);
if (extra_p == NULL) if (slot->slot_next != NULL) {
r = TmThreadsSlotVarRun(tv, extra_p, slot->slot_next);
if (r == TM_ECODE_FAILED) {
TmThreadsSlotProcessPktFail(tv, slot, extra_p);
break; break;
if (slot->slot_next != NULL) {
r = TmThreadsSlotVarRun(tv, extra_p, slot->slot_next);
if (r == TM_ECODE_FAILED) {
SCMutexLock(&slot->slot_post_pq.mutex_q);
TmqhReleasePacketsToPacketPool(&slot->slot_post_pq);
SCMutexUnlock(&slot->slot_post_pq.mutex_q);
TmqhOutputPacketpool(tv, extra_p);
TmThreadsSetFlag(tv, THV_FAILED);
break;
}
} }
tv->tmqh_out(tv, extra_p);
} }
} /* if (slot->slot_post_pq.top != NULL) */ tv->tmqh_out(tv, extra_p);
slot = slot->slot_next; }
} /* while (slot != NULL) */ } /* if (slot->slot_post_pq.top != NULL) */
} }
return TM_ECODE_OK;
return r;
} }
/** /**

Loading…
Cancel
Save