5 *Initialize message queue
6 *@param[in] msgq Message queue
8 void fwp_msgq_init(struct fwp_msgq *msgq)
13 pthread_mutex_init(&msgq->lock, NULL); /* fast mutex */
14 sem_init(&msgq->empty_lock, 0, 0);
18 * Enqueue message in message queue
20 * @param[in] msgq Message queue
21 *`@param[in] msgb Message buffer which stores a message
23 * Zero on success, -1 or error.
25 int fwp_msgq_enqueue(struct fwp_msgq *msgq, struct fwp_msgb *msgb)
27 /* acquire queue mutex */
28 pthread_mutex_lock(&msgq->lock);
30 if (!(msgq->nr_pending < FWP_MSGQ_SIZE)){
31 /*if (msgq->qr_policy == NEWCOMER) {*/
33 /*release queue mutex*/
34 pthread_mutex_unlock(&msgq->lock);
38 * if (msgq->qr_policy == OLDEST)
39 msgq->first = (msgq->first++) % FWP_MSGQ_SIZE;
44 /* depends on queuing policy specifies in endpoint */
45 msgq->queue[msgq->in] = msgb;
47 msgq->in = (++msgq->in) & (FWP_MSGQ_SIZE - 1);
49 /* release queue mutex */
50 pthread_mutex_unlock(&msgq->lock);
51 sem_post(&msgq->empty_lock);
57 * Dequeue message from message queue
59 * @param[in] msgq Message queue
61 * NULL if message queue in empty
62 * else returns pointer to message buffer(msgb)
64 struct fwp_msgb* fwp_msgq_dequeue(struct fwp_msgq *msgq)
66 struct fwp_msgb* msgb;
68 if (msgq->in == msgq->out)
71 /* acquire queue mutex */
72 pthread_mutex_lock(&msgq->lock);
74 msgb = msgq->queue[msgq->out];
76 msgq->out = (++msgq->out) & (FWP_MSGQ_SIZE - 1);
78 /* release queue mutex */
79 pthread_mutex_unlock(&msgq->lock);
85 * Dequeue all messages from message queue
87 * @param[in] msgq Message queue
89 * NULL if message queue is empty
90 * else returns pointer to message buffer(msgb)
92 void fwp_msgq_dequeue_all(struct fwp_msgq *msgq)
94 struct fwp_msgb *msgb;
96 while ((msgb = fwp_msgq_dequeue(msgq))) {