summaryrefslogtreecommitdiff
path: root/mysys/my_alloc.c
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2002-04-13 12:08:12 +0300
committerunknown <bell@sanja.is.com.ua>2002-04-13 12:08:12 +0300
commitf095ef5dc2bac8eebd87919f5106e30d4e21cabf (patch)
treef5d09a2f85ce2f9558ed0aac2b929454e2b29f62 /mysys/my_alloc.c
parenta58fbde1d29c8da4e1cb509d0ad9cf2bc86a3839 (diff)
downloadmariadb-git-f095ef5dc2bac8eebd87919f5106e30d4e21cabf.tar.gz
allocated bigger blocks if it needed
include/my_sys.h: memory root structures definition put in one file include/mysql.h: memory root structures definition put in one file
Diffstat (limited to 'mysys/my_alloc.c')
-rw-r--r--mysys/my_alloc.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c
index 789e64526a3..5a6afe2fac9 100644
--- a/mysys/my_alloc.c
+++ b/mysys/my_alloc.c
@@ -29,6 +29,7 @@ void init_alloc_root(MEM_ROOT *mem_root, uint block_size,
mem_root->min_malloc=32;
mem_root->block_size=block_size-MALLOC_OVERHEAD-sizeof(USED_MEM)-8;
mem_root->error_handler=0;
+ mem_root->block_num= 0;
#if !(defined(HAVE_purify) && defined(EXTRA_DEBUG))
if (pre_alloc_size)
{
@@ -61,25 +62,20 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size)
mem_root->used=next;
return (gptr) (((char*) next)+ALIGN_SIZE(sizeof(USED_MEM)));
#else
- uint get_size,max_left;
+ uint get_size, block_size;
gptr point;
reg1 USED_MEM *next;
reg2 USED_MEM **prev;
Size= ALIGN_SIZE(Size);
prev= &mem_root->free;
- max_left=0;
for (next= *prev ; next && next->left < Size ; next= next->next)
- {
- if (next->left > max_left)
- max_left=next->left;
prev= &next->next;
- }
if (! next)
{ /* Time to alloc new block */
+ block_size= mem_root->block_size*((mem_root->block_num>>2)+1);
get_size= Size+ALIGN_SIZE(sizeof(USED_MEM));
- if (max_left*4 < mem_root->block_size && get_size < mem_root->block_size)
- get_size=mem_root->block_size; /* Normal alloc */
+ get_size= max(get_size, block_size);
if (!(next = (USED_MEM*) my_malloc(get_size,MYF(MY_WME))))
{
@@ -87,6 +83,7 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size)
(*mem_root->error_handler)();
return((gptr) 0); /* purecov: inspected */
}
+ mem_root->block_num++;
next->next= *prev;
next->size= get_size;
next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
@@ -165,7 +162,10 @@ void free_root(MEM_ROOT *root, myf MyFlags)
root->free=root->pre_alloc;
root->free->left=root->pre_alloc->size-ALIGN_SIZE(sizeof(USED_MEM));
root->free->next=0;
+ root->block_num= 1;
}
+ else
+ root->block_num= 0;
DBUG_VOID_RETURN;
}