From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39471) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XEVVa-0001vc-KT for qemu-devel@nongnu.org; Mon, 04 Aug 2014 23:34:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XEVVR-0001S5-JA for qemu-devel@nongnu.org; Mon, 04 Aug 2014 23:33:54 -0400 Received: from mail-pa0-f47.google.com ([209.85.220.47]:56152) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XEVVR-0001S1-E7 for qemu-devel@nongnu.org; Mon, 04 Aug 2014 23:33:45 -0400 Received: by mail-pa0-f47.google.com with SMTP id kx10so528848pab.6 for ; Mon, 04 Aug 2014 20:33:44 -0700 (PDT) From: Ming Lei Date: Tue, 5 Aug 2014 11:33:02 +0800 Message-Id: <1407209598-2572-2-git-send-email-ming.lei@canonical.com> In-Reply-To: <1407209598-2572-1-git-send-email-ming.lei@canonical.com> References: <1407209598-2572-1-git-send-email-ming.lei@canonical.com> Subject: [Qemu-devel] [PATCH v1 01/17] 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, Peter Maydell , 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