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__ */ } /*