PatchworkOS  19e446b
A non-POSIX operating system.
Loading...
Searching...
No Matches
pool.c
Go to the documentation of this file.
1#include <kernel/mem/pool.h>
2
3void pool_init(pool_t* pool, void* elements, size_t capacity, size_t elementSize, size_t nextOffset)
4{
5 atomic_init(&pool->used, 0);
6 atomic_init(&pool->free, 0);
7 pool->elements = elements;
8 pool->elementSize = elementSize;
9 pool->nextOffset = nextOffset;
10 pool->capacity = capacity;
11
12 for (size_t i = 0; i < capacity; i++)
13 {
14 void* element = (void*)((uintptr_t)elements + (i * elementSize));
15 pool_idx_t* next = (pool_idx_t*)((uintptr_t)element + nextOffset);
16 *next = (i == capacity - 1) ? POOL_IDX_MAX : (pool_idx_t)(i + 1);
17 }
18}
19
21{
22 pool_idx_t idx;
23 while (true)
24 {
26 idx = (pool_idx_t)(head & POOL_IDX_MAX);
27 if (idx == POOL_IDX_MAX)
28 {
29 return POOL_IDX_MAX;
30 }
31
32 void* element = (void*)((uintptr_t)pool->elements + (idx * pool->elementSize));
33 pool_idx_t next = *(pool_idx_t*)((uintptr_t)element + pool->nextOffset);
34
35 uint64_t newHead = ((head & ~POOL_IDX_MAX) + POOL_TAG_INC) | next;
38 {
39 break;
40 }
41 ASM("pause");
42 }
43
45 return idx;
46}
47
48void pool_free(pool_t* pool, pool_idx_t idx)
49{
50 void* element = (void*)((uintptr_t)pool->elements + (idx * pool->elementSize));
51 pool_idx_t* next = (pool_idx_t*)((uintptr_t)element + pool->nextOffset);
52
53 while (true)
54 {
56 *next = (pool_idx_t)(head & POOL_IDX_MAX);
57 uint64_t newHead = ((head & ~POOL_IDX_MAX) + POOL_TAG_INC) | idx;
58
61 {
62 break;
63 }
64 ASM("pause");
65 }
67}
pool_idx_t pool_alloc(pool_t *pool)
Allocate an element from the pool.
Definition pool.c:20
void pool_free(pool_t *pool, pool_idx_t idx)
Free an element back to the pool.
Definition pool.c:48
#define POOL_IDX_MAX
The maximum index value for pool.
Definition pool.h:29
void pool_init(pool_t *pool, void *elements, size_t capacity, size_t elementSize, size_t nextOffset)
Initialize a pool.
Definition pool.c:3
#define POOL_TAG_INC
The amount to increment the tag by in the tagged free list.
Definition pool.h:31
uint16_t pool_idx_t
Pool index type.
Definition pool.h:27
#define ASM(...)
Inline assembly macro.
Definition defs.h:160
static atomic_long next
Definition main.c:12
@ memory_order_release
Definition stdatomic.h:119
@ memory_order_relaxed
Definition stdatomic.h:116
@ memory_order_acquire
Definition stdatomic.h:118
#define atomic_fetch_add_explicit(object, operand, order)
Definition stdatomic.h:259
#define atomic_load_explicit(object, order)
Definition stdatomic.h:264
#define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure)
Definition stdatomic.h:240
#define atomic_init(obj, value)
Definition stdatomic.h:75
#define atomic_fetch_sub_explicit(object, operand, order)
Definition stdatomic.h:262
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:43
Pool structure.
Definition pool.h:38
atomic_uint64_t free
The tagged head of the free list.
Definition pool.h:40
size_t nextOffset
Offset of a pool_idx_t variable within each element used for the free list.
Definition pool.h:43
size_t capacity
Maximum number of elements.
Definition pool.h:44
atomic_size_t used
Number of used elements.
Definition pool.h:39
size_t elementSize
Size of each element.
Definition pool.h:42
void * elements
Pointer to the elements array.
Definition pool.h:41