BeRTOS
|
Pool macros. More...
Defines | |
#define | EXTERN_POOL(name) extern List name |
Extern pool declaration. | |
#define | DECLARE_POOL(name, type, num) DECLARE_POOL_WITH_STORAGE(name, type, num, List) |
Helper macro to declare a Pool data type. | |
#define | DECLARE_POOL_STATIC(name, type, num) DECLARE_POOL_WITH_STORAGE(name, type, num, static List) |
Static Pool declaration. | |
#define | pool_init(name, init_func) (*(name##_init))(init_func) |
Initialize the pool name, calling init_func on each element. | |
#define | pool_alloc(name) list_remHead(name) |
Allocate an element from the pool. | |
#define | pool_free(name, elem) ADDHEAD(name, (Node*)elem) |
Recycle an element into the pool. | |
#define | pool_empty(name) LIST_EMPTY(name) |
Test if the pool is empty. |
Pool macros.
The pool module provides the boilerplate code to create a set of objects of the same type. It provides an interface similar to the heap module, with pool_alloc() and pool_free() functions that allocate and free an element respectively. In contrast with the heap module, you can specify exactly the number of items that you want to be in the pool.
Items in the pool must be a derived class of Node *
, which also means that they can be used as-is with list containers, eg. MsgPort.
Example code:
typedef struct MyType { Node *n; uint16_t *buf; // other members here... } MyType; DECLARE_POOL(mypool, MyType, POOL_SIZE); static void elem_init(MyType *e) { e->buf = NULL; // other initializations here } int main(void) { pool_init(&mypool, elem_init); MyType *foo = pool_alloc(&mypool); // do stuff with foo pool_free(&mypool, foo); }
#define DECLARE_POOL | ( | name, | |
type, | |||
num | |||
) | DECLARE_POOL_WITH_STORAGE(name, type, num, List) |
#define DECLARE_POOL_STATIC | ( | name, | |
type, | |||
num | |||
) | DECLARE_POOL_WITH_STORAGE(name, type, num, static List) |
#define pool_alloc | ( | name | ) | list_remHead(name) |
Allocate an element from the pool.
The returned element is of type Node *
, it's safe to cast it to the type contained in the pool.
name | Pointer to pool to alloc from. |
#define pool_empty | ( | name | ) | LIST_EMPTY(name) |
#define pool_free | ( | name, | |
elem | |||
) | ADDHEAD(name, (Node*)elem) |
#define pool_init | ( | name, | |
init_func | |||
) | (*(name##_init))(init_func) |
Initialize the pool name, calling init_func on each element.
The init function must have the following prototype:
void init_func(type *)
where type is the type of objects held in the pool.
name | Pool to initialize |
init_func | Init function to be called on each element |