utils
utilities in C for microcontrollers
pool
pool.h
Go to the documentation of this file.
1
6
#ifndef POOL_H
7
#define POOL_H
8
9
#include <stddef.h>
10
#include <stdbool.h>
11
#include "
slist.h
"
12
19
#define POOL(name, type, size) \
20
union pool_##name##_private { \
21
struct slist_element element; \
22
type data; \
23
}; \
24
struct pool_##name { \
25
struct slist free_list; \
26
union pool_##name##_private items[size]; \
27
}; \
28
static inline int pool_##name##_init(struct pool_##name *self) { \
29
if (!self) return -1; \
30
slist_init(&self->free_list); \
31
for (size_t i = 0; i < size; ++i) { \
32
slist_prepend(&self->free_list, &self->items[i].element); \
33
} \
34
return 0; \
35
} \
36
static inline type *pool_##name##_alloc(struct pool_##name *self) { \
37
if (!self) return NULL; \
38
struct slist_element *head; \
39
if (slist_remove_head(&self->free_list, &head)) \
40
return NULL; \
41
union pool_##name##_private *item = (union pool_##name##_private *) \
42
(((char *)head) - offsetof(union pool_##name##_private, element)); \
43
return &item->data; \
44
} \
45
static inline void pool_##name##_free(struct pool_##name *self, type *obj) { \
46
if (!self || !obj) return; \
47
union pool_##name##_private *item = (union pool_##name##_private *) \
48
(((char *)obj) - offsetof(union pool_##name##_private, data)); \
49
slist_prepend(&self->free_list, &item->element); \
50
}
51
52
#ifdef DOXYGEN
53
POOL
(NAME, TYPE, SIZE);
89
#endif
90
91
#endif //POOL_H
POOL
#define POOL(name, type, size)
Generates the pool api.
Definition:
pool.h:19
slist.h
An intrusive singly linked list.
Generated by
1.8.14