blob: b38d486845b273014db11cf10bd2f51d1d6a4cb1 [file] [log] [blame]
/* See COPYRIGHT for copyright information. */
/* Kevin Klues <klueska@cs.berkeley.edu> */
#pragma once
#include <string.h>
#define POOL_TYPE_DEFINE(_type, p, sz) \
typedef struct struct_##p { \
uint32_t size; \
uint32_t free; \
uint32_t index; \
_type* queue[(sz)]; \
_type pool[(sz)]; \
} p##_t;
#define POOL_INIT(p, sz) \
({ \
(p)->size = (sz); \
(p)->free = (sz); \
(p)->index = 0; \
memset((p)->pool, 0, (sz) * sizeof((p)->pool[0])); \
for(int i=0; i<(p)->size; i++) { \
(p)->queue[i] = &((p)->pool[i]); \
} \
})
#define POOL_GET(p) \
({ \
void* rval = NULL; \
if((p)->free) { \
rval = (p)->queue[(p)->index]; \
(p)->queue[(p)->index] = NULL; \
(p)->free--; \
(p)->index++; \
if((p)->index == (p)->size) { \
(p)->index = 0; \
} \
} \
rval; \
})
// emptyIndex is also the first element that has been allocated, iterate thru to
// index-1
#define POOL_FOR_EACH(p, func) \
({ \
int emptyIndex = ((p)->index + (p)->free); \
if (emptyIndex >= (p)->size) { \
emptyIndex -= (p)->size; \
} \
for(int _i = emptyIndex; _i < (p)->index; _i++){ \
func((p)->queue[_i]); \
} \
})
#define POOL_PUT(p, val) \
({ \
int rval = -1; \
if((p)->free < (p)->size) { \
int emptyIndex = ((p)->index + (p)->free); \
if (emptyIndex >= (p)->size) { \
emptyIndex -= (p)->size; \
} \
(p)->queue[emptyIndex] = val; \
(p)->free++; \
rval = 1; \
} \
rval; \
})
#define POOL_EMPTY(p) ((p)->free == 0)
#define POOL_SIZE(p) ((p)->free)
#define POOL_MAX_SIZE(p) ((p)->size)