diff --git a/src/tm-threads.c b/src/tm-threads.c index 7ed0600a5c..de769f948d 100644 --- a/src/tm-threads.c +++ b/src/tm-threads.c @@ -142,7 +142,11 @@ void *TmThreadsSlot1NoIn(void *td) /* handle error */ if (r == TM_ECODE_FAILED) { TmqhReleasePacketsToPacketPool(&s->slot_pre_pq); + + SCMutexLock(&s->slot_post_pq.mutex_q); TmqhReleasePacketsToPacketPool(&s->slot_post_pq); + SCMutexUnlock(&s->slot_post_pq.mutex_q); + if (p != NULL) TmqhOutputPacketpool(tv, p); TmThreadsSetFlag(tv, THV_FAILED); @@ -383,7 +387,11 @@ void *TmThreadsSlot1(void *td) /* handle error */ if (r == TM_ECODE_FAILED) { TmqhReleasePacketsToPacketPool(&s->slot_pre_pq); + + SCMutexLock(&s->slot_post_pq.mutex_q); TmqhReleasePacketsToPacketPool(&s->slot_post_pq); + SCMutexUnlock(&s->slot_post_pq.mutex_q); + TmqhOutputPacketpool(tv, p); TmThreadsSetFlag(tv, THV_FAILED); break; @@ -464,7 +472,11 @@ TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p, if (unlikely(r == TM_ECODE_FAILED)) { /* Encountered error. Return packets to packetpool and return */ TmqhReleasePacketsToPacketPool(&s->slot_pre_pq); + + SCMutexLock(&s->slot_post_pq.mutex_q); TmqhReleasePacketsToPacketPool(&s->slot_post_pq); + SCMutexUnlock(&s->slot_post_pq.mutex_q); + TmThreadsSetFlag(tv, THV_FAILED); return TM_ECODE_FAILED; } @@ -480,7 +492,11 @@ TmEcode TmThreadsSlotVarRun(ThreadVars *tv, Packet *p, r = TmThreadsSlotVarRun(tv, extra_p, s->slot_next); if (unlikely(r == TM_ECODE_FAILED)) { TmqhReleasePacketsToPacketPool(&s->slot_pre_pq); + + SCMutexLock(&s->slot_post_pq.mutex_q); TmqhReleasePacketsToPacketPool(&s->slot_post_pq); + SCMutexUnlock(&s->slot_post_pq.mutex_q); + TmqhOutputPacketpool(tv, extra_p); TmThreadsSetFlag(tv, THV_FAILED); return TM_ECODE_FAILED; @@ -667,20 +683,26 @@ void *TmThreadsSlotVar(void *td) tv->tmqh_out(tv, p); } /* if (p != NULL) */ + /* now handle the post_pq packets */ TmSlot *slot; for (slot = s; slot != NULL; slot = slot->slot_next) { if (slot->slot_post_pq.top != NULL) { - SCMutexLock(&slot->slot_post_pq.mutex_q); - while (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) 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; @@ -689,7 +711,6 @@ void *TmThreadsSlotVar(void *td) /* output the packet */ tv->tmqh_out(tv, extra_p); } /* while */ - SCMutexUnlock(&slot->slot_post_pq.mutex_q); } /* if */ } /* for */ diff --git a/src/tm-threads.h b/src/tm-threads.h index d06e7791f6..ac2804bf69 100644 --- a/src/tm-threads.h +++ b/src/tm-threads.h @@ -131,7 +131,10 @@ static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet TmqhOutputPacketpool(tv, p); TmSlot *slot = s; while (slot != NULL) { + SCMutexLock(&slot->slot_post_pq.mutex_q); TmqhReleasePacketsToPacketPool(&slot->slot_post_pq); + SCMutexUnlock(&slot->slot_post_pq.mutex_q); + slot = slot->slot_next; } TmThreadsSetFlag(tv, THV_FAILED); @@ -139,27 +142,33 @@ static inline TmEcode TmThreadsSlotProcessPkt(ThreadVars *tv, TmSlot *s, Packet } else { tv->tmqh_out(tv, p); + /* post process pq */ TmSlot *slot = s; while (slot != NULL) { if (slot->slot_post_pq.top != NULL) { - SCMutexLock(&slot->slot_post_pq.mutex_q); - while (slot->slot_post_pq.top != NULL) { + while (1) { + SCMutexLock(&slot->slot_post_pq.mutex_q); Packet *extra_p = PacketDequeue(&slot->slot_post_pq); - if (extra_p != NULL) { - if (slot->slot_next != NULL) { - r = TmThreadsSlotVarRun(tv, extra_p, slot->slot_next); - if (r == TM_ECODE_FAILED) { - TmqhReleasePacketsToPacketPool(&slot->slot_post_pq); - TmqhOutputPacketpool(tv, extra_p); - TmThreadsSetFlag(tv, THV_FAILED); - break; - } + SCMutexUnlock(&slot->slot_post_pq.mutex_q); + + if (extra_p == NULL) + 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); } - } /* while (slot->slot_post_pq.top != NULL) */ - SCMutexUnlock(&slot->slot_post_pq.mutex_q); + tv->tmqh_out(tv, extra_p); + } } /* if (slot->slot_post_pq.top != NULL) */ slot = slot->slot_next; } /* while (slot != NULL) */