diff --git a/src/tm-threads.c b/src/tm-threads.c index 6e7d31891b9d..93c7c1c7d44f 100644 --- a/src/tm-threads.c +++ b/src/tm-threads.c @@ -211,6 +211,8 @@ void *TmThreadsSlot1NoIn(void *td) } } /* while (run) */ + PacketPoolDestroy(); + TmThreadsSetFlag(tv, THV_RUNNING_DONE); TmThreadWaitForFlag(tv, THV_DEINIT); @@ -305,6 +307,8 @@ void *TmThreadsSlot1NoOut(void *td) } } /* while (run) */ + PacketPoolDestroy(); + TmThreadsSetFlag(tv, THV_RUNNING_DONE); TmThreadWaitForFlag(tv, THV_DEINIT); @@ -394,6 +398,8 @@ void *TmThreadsSlot1NoInOut(void *td) } } /* while (run) */ + PacketPoolDestroy(); + TmThreadsSetFlag(tv, THV_RUNNING_DONE); TmThreadWaitForFlag(tv, THV_DEINIT); @@ -523,6 +529,8 @@ void *TmThreadsSlot1(void *td) } } /* while (run) */ + PacketPoolDestroy(); + TmThreadsSetFlag(tv, THV_RUNNING_DONE); TmThreadWaitForFlag(tv, THV_DEINIT); @@ -722,6 +730,8 @@ void *TmThreadsSlotPktAcqLoop(void *td) { } SCPerfSyncCounters(tv); + PacketPoolDestroy(); + TmThreadsSetFlag(tv, THV_RUNNING_DONE); TmThreadWaitForFlag(tv, THV_DEINIT); diff --git a/src/tmqh-packetpool.c b/src/tmqh-packetpool.c index 1f0a3ec7b94b..44ad6d664e1b 100644 --- a/src/tmqh-packetpool.c +++ b/src/tmqh-packetpool.c @@ -58,23 +58,12 @@ static inline PktPool *GetThreadPacketPool(void) { return &thread_pkt_pool; } - -static inline PktPool *ThreadPacketPoolCreate(void) -{ - /* Nothing to do since __thread statically allocates the memory. */ - return GetThreadPacketPool(); -} #else /* __thread not supported. */ static pthread_key_t pkt_pool_thread_key; static SCMutex pkt_pool_thread_key_mutex = SCMUTEX_INITIALIZER; static int pkt_pool_thread_key_initialized = 0; -static inline PktPool *GetThreadPacketPool(void) -{ - return (PktPool*)pthread_getspecific(pkt_pool_thread_key); -} - static void PktPoolThreadDestroy(void * buf) { free(buf); @@ -102,15 +91,10 @@ static void TmqhPacketpoolInit(void) SCMutexUnlock(&pkt_pool_thread_key_mutex); } -static inline PktPool *ThreadPacketPoolCreate(void) +static PktPool *ThreadPacketPoolCreate(void) { TmqhPacketpoolInit(); - /* Check that the pool is not already created */ - PktPool *pool = GetThreadPacketPool(); - if (pool) - return pool; - /* Create a new pool for this thread. */ pool = (PktPool*)SCMallocAligned(sizeof(PktPool), CLS); if (pool == NULL) { @@ -125,6 +109,15 @@ static inline PktPool *ThreadPacketPoolCreate(void) return pool; } + +static inline PktPool *GetThreadPacketPool(void) +{ + PktPool* pool = (PktPool*)pthread_getspecific(pkt_pool_thread_key); + if (pool == NULL) + pool = ThreadPacketPoolCreate(); + + return pool; +} #endif /** @@ -168,6 +161,15 @@ static void PacketPoolStorePacket(Packet *p) PacketPoolReturnPacket(p); } +static void PacketPoolGetReturnedPackets(PktPool *pool) +{ + SCMutexLock(&pool->return_stack.mutex); + /* Move all the packets from the locked return stack to the local stack. */ + pool->head = pool->return_stack.head; + pool->return_stack.head = NULL; + SCMutexUnlock(&pool->return_stack.mutex); +} + /** \brief Get a new packet from the packet pool * * Only allocates from the thread's local stack, or mallocs new packets. @@ -189,11 +191,7 @@ Packet *PacketPoolGetPacket(void) /* Local Stack is empty, so check the return stack, which requires * locking. */ - SCMutexLock(&pool->return_stack.mutex); - /* Move all the packets from the locked return stack to the local stack. */ - pool->head = pool->return_stack.head; - pool->return_stack.head = NULL; - SCMutexUnlock(&pool->return_stack.mutex); + PacketPoolGetReturnedPackets(pool); /* Try to allocate again. Need to check for not empty again, since the * return stack might have been empty too. @@ -266,7 +264,7 @@ void PacketPoolInit(void) { extern intmax_t max_pending_packets; - PktPool *my_pool = ThreadPacketPoolCreate(); + PktPool *my_pool = GetThreadPacketPool(); SCMutexInit(&my_pool->return_stack.mutex, NULL); @@ -286,14 +284,13 @@ void PacketPoolInit(void) max_pending_packets, (uintmax_t)(max_pending_packets*SIZE_OF_PACKET)); } -void PacketPoolDestroy(void) { -#if 0 +void PacketPoolDestroy(void) +{ Packet *p = NULL; while ((p = PacketPoolGetPacket()) != NULL) { PACKET_CLEANUP(p); SCFree(p); } -#endif } Packet *TmqhInputPacketpool(ThreadVars *tv)