Loading include/my_alloc.h +10 −3 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ #ifndef _my_alloc_h #define _my_alloc_h #define MAX_BLOCK_USAGE_BEFORE_DROP 10 typedef struct st_used_mem { /* struct for once_alloc (block) */ struct st_used_mem *next; /* Next block in use */ Loading @@ -38,6 +40,11 @@ typedef struct st_mem_root unsigned int min_malloc; unsigned int block_size; /* initial block size */ unsigned int block_num; /* allocated blocks counter */ /* first free block in queue test counter (if it exceed MAX_BLOCK_USAGE_BEFORE_DROP block will be droped in 'used' list) */ unsigned int first_block_usage; void (*error_handler)(void); } MEM_ROOT; Loading mysys/my_alloc.c +33 −17 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ void init_alloc_root(MEM_ROOT *mem_root, uint block_size, mem_root->block_size= block_size-MALLOC_OVERHEAD-sizeof(USED_MEM)-8; mem_root->error_handler= 0; mem_root->block_num= 0; mem_root->first_block_usage= 0; #if !(defined(HAVE_purify) && defined(EXTRA_DEBUG)) if (pre_alloc_size) { Loading Loading @@ -64,13 +65,24 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size) #else uint get_size, block_size; gptr point; reg1 USED_MEM *next; reg1 USED_MEM *next= 0; reg2 USED_MEM **prev; Size= ALIGN_SIZE(Size); prev= &mem_root->free; if ( (*(prev= &mem_root->free)) != NULL ) { if( (*prev)->left < Size && mem_root->first_block_usage++ >= MAX_BLOCK_USAGE_BEFORE_DROP ) { next= *prev; *prev= next->next; /* Remove block from list */ next->next= mem_root->used; mem_root->used= next; mem_root->first_block_usage= 0; } for (next= *prev ; next && next->left < Size ; next= next->next) prev= &next->next; } if (! next) { /* Time to alloc new block */ block_size= mem_root->block_size*((mem_root->block_num>>2)+1); Loading @@ -89,12 +101,15 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size) next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM)); *prev=next; } point= (gptr) ((char*) next+ (next->size-next->left)); /*TODO: next part may be unneded due to mem_root->first_block_usage counter*/ if ((next->left-= Size) < mem_root->min_malloc) { /* Full block */ *prev= next->next; /* Remove block from list */ next->next= mem_root->used; mem_root->used= next; mem_root->first_block_usage= 0; } return(point); #endif Loading Loading @@ -166,6 +181,7 @@ void free_root(MEM_ROOT *root, myf MyFlags) } else root->block_num= 0; root->first_block_usage= 0; DBUG_VOID_RETURN; } Loading Loading
include/my_alloc.h +10 −3 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ #ifndef _my_alloc_h #define _my_alloc_h #define MAX_BLOCK_USAGE_BEFORE_DROP 10 typedef struct st_used_mem { /* struct for once_alloc (block) */ struct st_used_mem *next; /* Next block in use */ Loading @@ -38,6 +40,11 @@ typedef struct st_mem_root unsigned int min_malloc; unsigned int block_size; /* initial block size */ unsigned int block_num; /* allocated blocks counter */ /* first free block in queue test counter (if it exceed MAX_BLOCK_USAGE_BEFORE_DROP block will be droped in 'used' list) */ unsigned int first_block_usage; void (*error_handler)(void); } MEM_ROOT; Loading
mysys/my_alloc.c +33 −17 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ void init_alloc_root(MEM_ROOT *mem_root, uint block_size, mem_root->block_size= block_size-MALLOC_OVERHEAD-sizeof(USED_MEM)-8; mem_root->error_handler= 0; mem_root->block_num= 0; mem_root->first_block_usage= 0; #if !(defined(HAVE_purify) && defined(EXTRA_DEBUG)) if (pre_alloc_size) { Loading Loading @@ -64,13 +65,24 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size) #else uint get_size, block_size; gptr point; reg1 USED_MEM *next; reg1 USED_MEM *next= 0; reg2 USED_MEM **prev; Size= ALIGN_SIZE(Size); prev= &mem_root->free; if ( (*(prev= &mem_root->free)) != NULL ) { if( (*prev)->left < Size && mem_root->first_block_usage++ >= MAX_BLOCK_USAGE_BEFORE_DROP ) { next= *prev; *prev= next->next; /* Remove block from list */ next->next= mem_root->used; mem_root->used= next; mem_root->first_block_usage= 0; } for (next= *prev ; next && next->left < Size ; next= next->next) prev= &next->next; } if (! next) { /* Time to alloc new block */ block_size= mem_root->block_size*((mem_root->block_num>>2)+1); Loading @@ -89,12 +101,15 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size) next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM)); *prev=next; } point= (gptr) ((char*) next+ (next->size-next->left)); /*TODO: next part may be unneded due to mem_root->first_block_usage counter*/ if ((next->left-= Size) < mem_root->min_malloc) { /* Full block */ *prev= next->next; /* Remove block from list */ next->next= mem_root->used; mem_root->used= next; mem_root->first_block_usage= 0; } return(point); #endif Loading Loading @@ -166,6 +181,7 @@ void free_root(MEM_ROOT *root, myf MyFlags) } else root->block_num= 0; root->first_block_usage= 0; DBUG_VOID_RETURN; } Loading