xref: /unit/src/nxt_app_queue.h (revision 1755:3b0331284155)
11555Smax.romanov@nginx.com 
21555Smax.romanov@nginx.com /*
31555Smax.romanov@nginx.com  * Copyright (C) NGINX, Inc.
41555Smax.romanov@nginx.com  */
51555Smax.romanov@nginx.com 
61555Smax.romanov@nginx.com #ifndef _NXT_APP_QUEUE_H_INCLUDED_
71555Smax.romanov@nginx.com #define _NXT_APP_QUEUE_H_INCLUDED_
81555Smax.romanov@nginx.com 
91555Smax.romanov@nginx.com 
101555Smax.romanov@nginx.com #include <nxt_app_nncq.h>
111555Smax.romanov@nginx.com 
121555Smax.romanov@nginx.com 
131555Smax.romanov@nginx.com /* Using Numeric Naive Circular Queue as a backend. */
141555Smax.romanov@nginx.com 
151555Smax.romanov@nginx.com #define NXT_APP_QUEUE_SIZE      NXT_APP_NNCQ_SIZE
161555Smax.romanov@nginx.com #define NXT_APP_QUEUE_MSG_SIZE  31
171555Smax.romanov@nginx.com 
181555Smax.romanov@nginx.com typedef struct {
191555Smax.romanov@nginx.com     uint8_t   size;
201555Smax.romanov@nginx.com     uint8_t   data[NXT_APP_QUEUE_MSG_SIZE];
211555Smax.romanov@nginx.com     uint32_t  tracking;
221555Smax.romanov@nginx.com } nxt_app_queue_item_t;
231555Smax.romanov@nginx.com 
241555Smax.romanov@nginx.com 
251555Smax.romanov@nginx.com typedef struct {
26*1755Smax.romanov@nginx.com     nxt_app_nncq_atomic_t  notified;
271555Smax.romanov@nginx.com     nxt_app_nncq_t         free_items;
281555Smax.romanov@nginx.com     nxt_app_nncq_t         queue;
291555Smax.romanov@nginx.com     nxt_app_queue_item_t   items[NXT_APP_QUEUE_SIZE];
301555Smax.romanov@nginx.com } nxt_app_queue_t;
311555Smax.romanov@nginx.com 
321555Smax.romanov@nginx.com 
331555Smax.romanov@nginx.com nxt_inline void
nxt_app_queue_init(nxt_app_queue_t volatile * q)341555Smax.romanov@nginx.com nxt_app_queue_init(nxt_app_queue_t volatile *q)
351555Smax.romanov@nginx.com {
361555Smax.romanov@nginx.com     nxt_app_nncq_atomic_t  i;
371555Smax.romanov@nginx.com 
381555Smax.romanov@nginx.com     nxt_app_nncq_init(&q->free_items);
391555Smax.romanov@nginx.com     nxt_app_nncq_init(&q->queue);
401555Smax.romanov@nginx.com 
411555Smax.romanov@nginx.com     for (i = 0; i < NXT_APP_QUEUE_SIZE; i++) {
421555Smax.romanov@nginx.com         nxt_app_nncq_enqueue(&q->free_items, i);
431555Smax.romanov@nginx.com     }
441555Smax.romanov@nginx.com 
45*1755Smax.romanov@nginx.com     q->notified = 0;
461555Smax.romanov@nginx.com }
471555Smax.romanov@nginx.com 
481555Smax.romanov@nginx.com 
491555Smax.romanov@nginx.com nxt_inline nxt_int_t
nxt_app_queue_send(nxt_app_queue_t volatile * q,const void * p,uint8_t size,uint32_t tracking,int * notify,uint32_t * cookie)501555Smax.romanov@nginx.com nxt_app_queue_send(nxt_app_queue_t volatile *q, const void *p,
511555Smax.romanov@nginx.com     uint8_t size, uint32_t tracking, int *notify, uint32_t *cookie)
521555Smax.romanov@nginx.com {
53*1755Smax.romanov@nginx.com     int                    n;
541555Smax.romanov@nginx.com     nxt_app_queue_item_t   *qi;
551555Smax.romanov@nginx.com     nxt_app_nncq_atomic_t  i;
561555Smax.romanov@nginx.com 
571555Smax.romanov@nginx.com     i = nxt_app_nncq_dequeue(&q->free_items);
581555Smax.romanov@nginx.com     if (i == nxt_app_nncq_empty(&q->free_items)) {
591555Smax.romanov@nginx.com         return NXT_AGAIN;
601555Smax.romanov@nginx.com     }
611555Smax.romanov@nginx.com 
621555Smax.romanov@nginx.com     qi = (nxt_app_queue_item_t *) &q->items[i];
631555Smax.romanov@nginx.com 
641555Smax.romanov@nginx.com     qi->size = size;
651555Smax.romanov@nginx.com     nxt_memcpy(qi->data, p, size);
661555Smax.romanov@nginx.com     qi->tracking = tracking;
671555Smax.romanov@nginx.com     *cookie = i;
681555Smax.romanov@nginx.com 
691555Smax.romanov@nginx.com     nxt_app_nncq_enqueue(&q->queue, i);
701555Smax.romanov@nginx.com 
71*1755Smax.romanov@nginx.com     n = nxt_atomic_cmp_set(&q->notified, 0, 1);
721555Smax.romanov@nginx.com 
731555Smax.romanov@nginx.com     if (notify != NULL) {
74*1755Smax.romanov@nginx.com         *notify = n;
751555Smax.romanov@nginx.com     }
761555Smax.romanov@nginx.com 
771555Smax.romanov@nginx.com     return NXT_OK;
781555Smax.romanov@nginx.com }
791555Smax.romanov@nginx.com 
801555Smax.romanov@nginx.com 
81*1755Smax.romanov@nginx.com nxt_inline void
nxt_app_queue_notification_received(nxt_app_queue_t volatile * q)82*1755Smax.romanov@nginx.com nxt_app_queue_notification_received(nxt_app_queue_t volatile *q)
83*1755Smax.romanov@nginx.com {
84*1755Smax.romanov@nginx.com     q->notified = 0;
85*1755Smax.romanov@nginx.com }
86*1755Smax.romanov@nginx.com 
87*1755Smax.romanov@nginx.com 
881555Smax.romanov@nginx.com nxt_inline nxt_bool_t
nxt_app_queue_cancel(nxt_app_queue_t volatile * q,uint32_t cookie,uint32_t tracking)891555Smax.romanov@nginx.com nxt_app_queue_cancel(nxt_app_queue_t volatile *q, uint32_t cookie,
901555Smax.romanov@nginx.com     uint32_t tracking)
911555Smax.romanov@nginx.com {
921555Smax.romanov@nginx.com     nxt_app_queue_item_t  *qi;
931555Smax.romanov@nginx.com 
941555Smax.romanov@nginx.com     qi = (nxt_app_queue_item_t *) &q->items[cookie];
951555Smax.romanov@nginx.com 
961555Smax.romanov@nginx.com     return nxt_atomic_cmp_set(&qi->tracking, tracking, 0);
971555Smax.romanov@nginx.com }
981555Smax.romanov@nginx.com 
991555Smax.romanov@nginx.com 
1001555Smax.romanov@nginx.com nxt_inline ssize_t
nxt_app_queue_recv(nxt_app_queue_t volatile * q,void * p,uint32_t * cookie)1011555Smax.romanov@nginx.com nxt_app_queue_recv(nxt_app_queue_t volatile *q, void *p, uint32_t *cookie)
1021555Smax.romanov@nginx.com {
1031555Smax.romanov@nginx.com     ssize_t                res;
1041555Smax.romanov@nginx.com     nxt_app_queue_item_t   *qi;
1051555Smax.romanov@nginx.com     nxt_app_nncq_atomic_t  i;
1061555Smax.romanov@nginx.com 
1071555Smax.romanov@nginx.com     i = nxt_app_nncq_dequeue(&q->queue);
1081555Smax.romanov@nginx.com     if (i == nxt_app_nncq_empty(&q->queue)) {
1091555Smax.romanov@nginx.com         *cookie = 0;
1101555Smax.romanov@nginx.com         return -1;
1111555Smax.romanov@nginx.com     }
1121555Smax.romanov@nginx.com 
1131555Smax.romanov@nginx.com     qi = (nxt_app_queue_item_t *) &q->items[i];
1141555Smax.romanov@nginx.com 
1151555Smax.romanov@nginx.com     res = qi->size;
1161555Smax.romanov@nginx.com     nxt_memcpy(p, qi->data, qi->size);
1171555Smax.romanov@nginx.com     *cookie = i;
1181555Smax.romanov@nginx.com 
1191555Smax.romanov@nginx.com     nxt_app_nncq_enqueue(&q->free_items, i);
1201555Smax.romanov@nginx.com 
1211555Smax.romanov@nginx.com     return res;
1221555Smax.romanov@nginx.com }
1231555Smax.romanov@nginx.com 
1241555Smax.romanov@nginx.com 
1251555Smax.romanov@nginx.com #endif /* _NXT_APP_QUEUE_H_INCLUDED_ */
126