@ -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 = Get ThreadPacketPool( ) ;
SCMutexInit ( & my_pool - > return_stack . mutex , NULL ) ;