From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53275) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7S7w-0001zv-MW for qemu-devel@nongnu.org; Wed, 16 Jul 2014 12:32:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X7S7p-0001QL-Kh for qemu-devel@nongnu.org; Wed, 16 Jul 2014 12:32:20 -0400 Received: from mail-pd0-f176.google.com ([209.85.192.176]:34237) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X7S7p-0001Oz-Eq for qemu-devel@nongnu.org; Wed, 16 Jul 2014 12:32:13 -0400 Received: by mail-pd0-f176.google.com with SMTP id y10so1487413pdj.7 for ; Wed, 16 Jul 2014 09:32:12 -0700 (PDT) From: Ming Lei Date: Thu, 17 Jul 2014 00:31:13 +0800 Message-Id: <1405528281-23744-7-git-send-email-ming.lei@canonical.com> In-Reply-To: <1405528281-23744-1-git-send-email-ming.lei@canonical.com> References: <1405528281-23744-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH RFC 06/14] qemu/obj_pool.h: introduce object allocation pool List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, Paolo Bonzini , Stefan Hajnoczi Cc: Kevin Wolf , Ming Lei , Fam Zheng , "Michael S. Tsirkin" This patch introduces object allocation pool for speeding up object allocation in fast path. Signed-off-by: Ming Lei --- 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