This patch introduces object allocation pool for speeding up object allocation in fast path.
Signed-off-by: Ming Lei <ming....@canonical.com> --- include/qemu/obj_pool.h | 64 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 include/qemu/obj_pool.h diff --git a/include/qemu/obj_pool.h b/include/qemu/obj_pool.h new file mode 100644 index 0000000..94b5f49 --- /dev/null +++ b/include/qemu/obj_pool.h @@ -0,0 +1,64 @@ +#ifndef QEMU_OBJ_POOL_HEAD +#define QEMU_OBJ_POOL_HEAD + +typedef struct { + unsigned int size; + unsigned int cnt; + + void **free_obj; + int free_idx; + + char *objs; +} ObjPool; + +static inline void obj_pool_init(ObjPool *op, void *objs_buf, void **free_objs, + unsigned int obj_size, unsigned cnt) +{ + int i; + + op->objs = (char *)objs_buf; + op->free_obj = free_objs; + op->size = obj_size; + op->cnt = cnt; + + for (i = 0; i < op->cnt; i++) { + op->free_obj[i] = (void *)&op->objs[i * op->size]; + } + op->free_idx = op->cnt; +} + +static inline void *obj_pool_get(ObjPool *op) +{ + void *obj; + + if (!op) { + return NULL; + } + + if (op->free_idx <= 0) { + return NULL; + } + + obj = op->free_obj[--op->free_idx]; + return obj; +} + +static inline bool obj_pool_has_obj(ObjPool *op, void *obj) +{ + return op && (unsigned long)obj >= (unsigned long)&op->objs[0] && + (unsigned long)obj <= + (unsigned long)&op->objs[(op->cnt - 1) * op->size]; +} + +static inline void obj_pool_put(ObjPool *op, void *obj) +{ + if (!op || !obj_pool_has_obj(op, obj)) { + return; + } + + assert(op->free_idx < op->cnt); + + op->free_obj[op->free_idx++] = obj; +} + +#endif -- 1.7.9.5