{
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);
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) {
return pool;
}
+
+static inline PktPool *GetThreadPacketPool(void)
+{
+ PktPool* pool = (PktPool*)pthread_getspecific(pkt_pool_thread_key);
+ if (pool == NULL)
+ pool = ThreadPacketPoolCreate();
+
+ return pool;
+}
#endif
/**
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.
/* 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.
{
extern intmax_t max_pending_packets;
- PktPool *my_pool = ThreadPacketPoolCreate();
+ PktPool *my_pool = GetThreadPacketPool();
SCMutexInit(&my_pool->return_stack.mutex, NULL);