1#ifndef _QUEUE_H_ 2#define _QUEUE_H_ 3 4#include <stdint.h> 5#include "linux_list.h" 6 7struct queue_node { 8 struct list_head head; 9 uint32_t type; 10 struct queue *owner; 11 size_t size; 12}; 13 14enum { 15 Q_ELEM_OBJ = 0, 16 Q_ELEM_CTL = 1, 17 Q_ELEM_ERR = 2, 18}; 19 20void queue_node_init(struct queue_node *n, int type); 21void *queue_node_data(struct queue_node *n); 22 23struct queue_object { 24 struct queue_node qnode; 25 char data[0]; 26}; 27 28struct queue_object *queue_object_new(int type, size_t size); 29void queue_object_free(struct queue_object *obj); 30 31struct evfd; 32 33#define QUEUE_NAMELEN 16 34 35struct queue { 36 struct list_head list; 37 unsigned int max_elems; 38 unsigned int num_elems; 39 uint32_t enospc_err; 40 uint32_t flags; 41 struct list_head head; 42 struct evfd *evfd; 43 char name[QUEUE_NAMELEN]; 44}; 45 46#define QUEUE_F_EVFD (1U << 0) 47 48struct queue *queue_create(const char *name, 49 int max_objects, unsigned int flags); 50void queue_destroy(struct queue *b); 51void queue_stats_show(int fd); 52unsigned int queue_len(const struct queue *b); 53int queue_add(struct queue *b, struct queue_node *n); 54int queue_del(struct queue_node *n); 55struct queue_node *queue_del_head(struct queue *b); 56int queue_in(struct queue *b, struct queue_node *n); 57void queue_iterate(struct queue *b, 58 const void *data, 59 int (*iterate)(struct queue_node *n, const void *data2)); 60int queue_get_eventfd(struct queue *b); 61 62#endif 63