27,13 → 27,13 |
*/ |
|
/* |
* This implementation of FIFO stores values in a statically |
* allocated array created on each FIFO's initialization. |
* As such, these FIFOs have upper bound on number of values |
* they can store. Push and pop operations are done via accessing |
* the array through head and tail indices. Because of better |
* operation ordering in fifo_pop(), the access policy for these |
* two indices is to 'increment (mod size of FIFO) and use'. |
* This implementation of FIFO stores values in an array |
* (static or dynamic). As such, these FIFOs have upper bound |
* on number of values they can store. Push and pop operations |
* are done via accessing the array through head and tail indices. |
* Because of better operation ordering in fifo_pop(), the access |
* policy for these two indices is to 'increment (mod size of FIFO) |
* and use'. |
*/ |
|
#ifndef __FIFO_H__ |
40,14 → 40,18 |
#define __FIFO_H__ |
|
#include <typedefs.h> |
#include <mm/slab.h> |
|
/** Create and initialize FIFO. |
/** Create and initialize static FIFO. |
* |
* FIFO is allocated statically. |
* This macro is suitable for creating smaller FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE(name, t, itms) \ |
#define FIFO_INITIALIZE_STATIC(name, t, itms) \ |
struct { \ |
t fifo[(itms)]; \ |
count_t items; \ |
59,6 → 63,28 |
.tail = 0 \ |
} |
|
/** Create and prepare dynamic FIFO. |
* |
* FIFO is allocated dynamically. |
* This macro is suitable for creating larger FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_DYNAMIC(name, t, itms) \ |
struct { \ |
t *fifo; \ |
count_t items; \ |
index_t head; \ |
index_t tail; \ |
} name = { \ |
.fifo = NULL, \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
|
/** Pop value from head of FIFO. |
* |
* @param name FIFO name. |
77,4 → 103,11 |
#define fifo_push(name, value) \ |
name.fifo[name.tail = (name.tail + 1) < name.items ? (name.tail + 1) : 0] = (value) |
|
/** Allocate memory for dynamic FIFO. |
* |
* @param name FIFO name. |
*/ |
#define fifo_create(name) \ |
name.fifo = malloc(sizeof(*name.fifo) * name.items, 0) |
|
#endif |