/* same as 'simple' */ Packet *TmqhInputFlow(ThreadVars *tv) { PacketQueue *q = &trans_q[tv->inq->id]; SCPerfSyncCountersIfSignalled(tv, 0); SCMutexLock(&q->mutex_q); if (q->len == 0) { /* if we have no packets in queue, wait... */ #ifdef __tile__ for (;;) { if (q->len > 0 || q->cond_q) break; SCMutexUnlock(&q->mutex_q); SCMutexLock(&q->mutex_q); } #else SCCondWait(&q->cond_q, &q->mutex_q); #endif } if (q->len > 0) { Packet *p = PacketDequeue(q); SCMutexUnlock(&q->mutex_q); return p; } else { /* return NULL if we have no pkt. Should only happen on signals. */ SCMutexUnlock(&q->mutex_q); return NULL; } }
/** \brief wait function for condition where ringbuffer is either * full or empty. * * \param rb ringbuffer * * Based on RINGBUFFER_MUTEX_WAIT define, we either sleep and spin * or use thread condition to wait. */ static inline void RingBufferDoWait(RingBuffer16 *rb) { #ifdef RINGBUFFER_MUTEX_WAIT SCMutexLock(&rb->wait_mutex); SCCondWait(&rb->wait_cond, &rb->wait_mutex); SCMutexUnlock(&rb->wait_mutex); #else usleep(USLEEP_TIME); #endif }
void PacketPoolWait(void) { PktPool *my_pool = GetThreadPacketPool(); if (PacketPoolIsEmpty(my_pool)) { SCMutexLock(&my_pool->return_stack.mutex); SC_ATOMIC_ADD(my_pool->return_stack.sync_now, 1); SCCondWait(&my_pool->return_stack.cond, &my_pool->return_stack.mutex); SCMutexUnlock(&my_pool->return_stack.mutex); } while(PacketPoolIsEmpty(my_pool)) cc_barrier(); }
/** \brief Wait until we have the requested ammount of packets in the pool * * In some cases waiting for packets is undesirable. Especially when * a wait would happen under a lock of some kind, other parts of the * engine could have to wait. * * This function only returns when at least N packets are in our pool. * * \param n number of packets needed */ void PacketPoolWaitForN(int n) { PktPool *my_pool = GetThreadPacketPool(); Packet *p = NULL; while (1) { int i = 0; PacketPoolWait(); /* count packets in our stack */ p = my_pool->head; while (p != NULL) { if (++i == n) return; p = p->next; } /* continue counting in the return stack */ if (my_pool->return_stack.head != NULL) { SCMutexLock(&my_pool->return_stack.mutex); p = my_pool->return_stack.head; while (p != NULL) { if (++i == n) { SCMutexUnlock(&my_pool->return_stack.mutex); return; } p = p->next; } SCMutexUnlock(&my_pool->return_stack.mutex); /* or signal that we need packets and wait */ } else { SCMutexLock(&my_pool->return_stack.mutex); SC_ATOMIC_ADD(my_pool->return_stack.sync_now, 1); SCCondWait(&my_pool->return_stack.cond, &my_pool->return_stack.mutex); SCMutexUnlock(&my_pool->return_stack.mutex); } } }
/* same as 'simple' */ Packet *TmqhInputFlow(ThreadVars *tv) { PacketQueue *q = &trans_q[tv->inq->id]; StatsSyncCountersIfSignalled(tv); SCMutexLock(&q->mutex_q); if (q->len == 0) { /* if we have no packets in queue, wait... */ SCCondWait(&q->cond_q, &q->mutex_q); } if (q->len > 0) { Packet *p = PacketDequeue(q); SCMutexUnlock(&q->mutex_q); return p; } else { /* return NULL if we have no pkt. Should only happen on signals. */ SCMutexUnlock(&q->mutex_q); return NULL; } }