#ifndef _FIFO_H
|
|
#define _FIFO_H
|
|
|
|
/* Main FIFO structure. Allocate memory for it yourself. */
|
|
typedef struct fifo_t {
|
|
void *head;
|
|
void *tail;
|
|
unsigned long long count;
|
|
} fifo_t;
|
|
|
|
typedef struct fifo_handle_t {
|
|
void *next;
|
|
} fifo_handle_t;
|
|
|
|
/* Initializes fifo structure. */
|
|
#define fifo_init(fifo) \
|
|
do { \
|
|
fifo_t *__q = fifo; \
|
|
__q->head = NULL; \
|
|
__q->tail = NULL; \
|
|
__q->count = 0; \
|
|
} while (0)
|
|
|
|
#define __fifo_push(fifo, p, h) \
|
|
do { \
|
|
fifo_t *__q = fifo; \
|
|
__typeof__ (p) e = p; \
|
|
e->h.next = NULL; \
|
|
if (__q->tail == NULL) { \
|
|
__q->head = e; \
|
|
} else { \
|
|
__typeof__ (e) t = __q->tail; \
|
|
t->h.next = e; \
|
|
} \
|
|
__q->tail = e; \
|
|
__q->count++; \
|
|
} while (0)
|
|
|
|
/* Puts an element to the queue. */
|
|
#define fifo_push(fifo, p) __fifo_push (fifo, p, fifo_handle)
|
|
|
|
#define __fifo_pop(fifo, p, h) \
|
|
do { \
|
|
fifo_t *__q = fifo; \
|
|
p = __q->head; \
|
|
if (p != NULL) { \
|
|
__q->count--; \
|
|
__q->head = p->h.next; \
|
|
if (__q->tail == p) \
|
|
__q->tail = NULL; \
|
|
} \
|
|
} while (0)
|
|
|
|
/* Pops the first element out of the queue. */
|
|
#define fifo_pop(fifo, p) __fifo_pop (fifo, p, fifo_handle)
|
|
|
|
#define __fifo_peak(fifo, p, h) \
|
|
do { \
|
|
p = (fifo)->head; \
|
|
} while (0)
|
|
|
|
/* Returns the first elemnt of the queue without removing. */
|
|
#define fifo_peak(fifo, p) __fifo_peak (fifo, p, fifo_handle)
|
|
|
|
/* Returns the length of the queue. */
|
|
#define fifo_length(fifo) ((fifo)->count)
|
|
|
|
/* Returns true if the queue is empty. */
|
|
#define fifo_empty(fifo) ((fifo)->count == 0)
|
|
|
|
#endif /* _FIFO_H */
|