Commit d5626a71 authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua
Browse files

Merge sanja.is.com.ua:/home/bell/mysql/mysql-4.0

into sanja.is.com.ua:/home/bell/mysql/work-mem-4.0
parents 3df213fb 347ca5ea
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -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 */
@@ -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;
+33 −17
Original line number Diff line number Diff line
@@ -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)
  {
@@ -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);
@@ -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
@@ -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;
}