diff --git a/src/suricata.c b/src/suricata.c index 5918708b8a..08f84cdc5e 100644 --- a/src/suricata.c +++ b/src/suricata.c @@ -2474,7 +2474,6 @@ int main(int argc, char **argv) if (suri.run_mode != RUNMODE_UNIX_SOCKET) { DefragDestroy(); } - PacketPoolDestroy(); MagicDeinit(); TmqhCleanup(); TmModuleRunDeInit(); diff --git a/src/tm-threads.c b/src/tm-threads.c index f7f2f2382e..181d04a0b6 100644 --- a/src/tm-threads.c +++ b/src/tm-threads.c @@ -402,6 +402,8 @@ void *TmThreadsSlotVar(void *td) char run = 1; TmEcode r = TM_ECODE_OK; + PacketPoolInitEmpty(); + /* Set the thread name */ if (SCSetThreadName(tv->name) < 0) { SCLogWarning(SC_ERR_THREAD_INIT, "Unable to set thread name"); @@ -524,6 +526,8 @@ void *TmThreadsSlotVar(void *td) TmThreadsSetFlag(tv, THV_RUNNING_DONE); TmThreadWaitForFlag(tv, THV_DEINIT); + PacketPoolDestroy(); + s = (TmSlot *)tv->tm_slots; for ( ; s != NULL; s = s->slot_next) { diff --git a/src/tmqh-packetpool.c b/src/tmqh-packetpool.c index 5ea5c426d3..79103a4a01 100644 --- a/src/tmqh-packetpool.c +++ b/src/tmqh-packetpool.c @@ -279,6 +279,19 @@ void PacketPoolReturnPacket(Packet *p) } } +void PacketPoolInitEmpty(void) +{ +#ifndef TLS + TmqhPacketPoolInit(); +#endif + + PktPool *my_pool = GetThreadPacketPool(); + + SCMutexInit(&my_pool->return_stack.mutex, NULL); + SCCondInit(&my_pool->return_stack.cond, NULL); + SC_ATOMIC_INIT(my_pool->return_stack.sync_now); +} + void PacketPoolInit(void) { extern intmax_t max_pending_packets; diff --git a/src/tmqh-packetpool.h b/src/tmqh-packetpool.h index f7c8b9fc1e..6da6fc6aa8 100644 --- a/src/tmqh-packetpool.h +++ b/src/tmqh-packetpool.h @@ -71,6 +71,7 @@ Packet *PacketPoolGetPacket(void); void PacketPoolWait(void); void PacketPoolReturnPacket(Packet *p); void PacketPoolInit(void); +void PacketPoolInitEmpty(void); void PacketPoolDestroy(void); #endif /* __TMQH_PACKETPOOL_H__ */