From 3ce36e4effc35c565424decb3700c7eee0128f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Mon, 1 Dec 2014 10:40:07 +0100 Subject: [PATCH] Issue #3 Use of __builtin_ffs and __builtin_clz for __l_alloc and __l_free when __GNUC__ is defined Increased L_SFC_MAX_ELEM_SIZE from 512 to 2048 --- include/proxysql_mem.h | 8 ++++---- lib/proxysql_mem.cpp | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/include/proxysql_mem.h b/include/proxysql_mem.h index c00094113..77ffbba84 100644 --- a/include/proxysql_mem.h +++ b/include/proxysql_mem.h @@ -1,8 +1,8 @@ #define L_SFC_MIN_ELEM_SIZE 8 -#define L_SFC_MID_ELEM_SIZE 64 -#define L_SFC_MAX_ELEM_SIZE 512 -#define L_SFP_ARRAY_MID 4 -#define L_SFP_ARRAY_LEN 7 +#define L_SFC_MID_ELEM_SIZE 128 +#define L_SFC_MAX_ELEM_SIZE 2048 +#define L_SFP_ARRAY_MID 5 +#define L_SFP_ARRAY_LEN 9 #define L_SFC_MEM_BLOCK_SIZE 262144 typedef struct _l_stack_t l_stack; typedef struct _l_super_free_chunk_t l_sfc; diff --git a/lib/proxysql_mem.cpp b/lib/proxysql_mem.cpp index 89ac81bc7..14ebdd73d 100644 --- a/lib/proxysql_mem.cpp +++ b/lib/proxysql_mem.cpp @@ -72,9 +72,17 @@ void * __l_alloc(l_sfp *sfp, size_t size) { } void *p; int i; +#ifdef __GNUC__ + unsigned int x=size; + int j=__builtin_clz(x); + int k=__builtin_ffs(x); + i=(k+j==(sizeof(unsigned int)*8) ? j : sizeof(unsigned int)*8+1-k); + i=(i >= 4 ? i-4 : 0); +#else i= ( size<=L_SFC_MID_ELEM_SIZE ? L_SFP_ARRAY_MID-1 : L_SFP_ARRAY_LEN-1 ); for ( ; i>=0 ; i-- ) { if ((size<<1)>sfp->sfc[i].elem_size || i==0) { +#endif /* __GNUC__ */ p=l_stack_pop(&sfp->sfc[i].stack); if (p) { //assert((uintptr_t)p%(sfp->sfc[i].elem_size)==0); @@ -88,8 +96,11 @@ void * __l_alloc(l_sfp *sfp, size_t size) { p=l_stack_pop(&sfp->sfc[i].stack); //assert((uintptr_t)p%(sfp->sfc[i].elem_size)==0); return p; +#ifdef __GNUC__ +#else } } +#endif /* __GNUC__ */ return NULL; } @@ -113,9 +124,17 @@ void __l_free(l_sfp *sfp, size_t size, void *p) { return; } int i; +#ifdef __GNUC__ + unsigned int x=size; + int j=__builtin_clz(x); + int k=__builtin_ffs(x); + i=(k+j==(sizeof(unsigned int)*8) ? j : sizeof(unsigned int)*8+1-k); + i=(i >= 4 ? i-4 : 0); +#else i= ( size<=L_SFC_MID_ELEM_SIZE ? L_SFP_ARRAY_MID-1 : L_SFP_ARRAY_LEN-1 ); for ( ; i>=0 ; i-- ) { if ((size<<1)>sfp->sfc[i].elem_size || i==0) { +#endif /* __GNUC__ */ //assert((uintptr_t)p%(sfp->sfc[i].elem_size)==0); l_stack_push(&sfp->sfc[i].stack,p); // sfp->sfc[i].free_cnt++; @@ -128,8 +147,11 @@ void __l_free(l_sfp *sfp, size_t size, void *p) { // } return; +#ifdef __GNUC__ +#else } } +#endif /* __GNUC__ */ } /*