home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / my_once.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  3KB  |  89 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /* Not MT-SAFE */
  19.  
  20. #ifdef SAFEMALLOC            /* We don't need SAFEMALLOC here */
  21. #undef SAFEMALLOC
  22. #endif
  23.  
  24. #include "mysys_priv.h"
  25. #include "my_static.h"
  26. #include "mysys_err.h"
  27.  
  28.     /* alloc for things we don't nead to free */
  29.     /* No DBUG_ENTER... here to get smaller dbug-startup */
  30.  
  31. gptr my_once_alloc(unsigned int Size, myf MyFlags)
  32. {
  33.   uint get_size,max_left;
  34.   gptr point;
  35.   reg1 USED_MEM *next;
  36.   reg2 USED_MEM **prev;
  37.  
  38.   Size= ALIGN_SIZE(Size);
  39.   prev= &my_once_root_block;
  40.   max_left=0;
  41.   for (next=my_once_root_block ; next && next->left < Size ; next= next->next)
  42.   {
  43.     if (next->left > max_left)
  44.       max_left=next->left;
  45.     prev= &next->next;
  46.   }
  47.   if (! next)
  48.   {                        /* Time to alloc new block */
  49.     get_size= Size+ALIGN_SIZE(sizeof(USED_MEM));
  50.     if (max_left*4 < my_once_extra && get_size < my_once_extra)
  51.       get_size=my_once_extra;            /* Normal alloc */
  52.  
  53.     if ((next = (USED_MEM*) malloc(get_size)) == 0)
  54.     {
  55.       my_errno=errno;
  56.       if (MyFlags & (MY_FAE+MY_WME))
  57.     my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),get_size);
  58.       return((gptr) 0);
  59.     }
  60.     DBUG_PRINT("test",("my_once_malloc %u byte malloced",get_size));
  61.     next->next= 0;
  62.     next->size= get_size;
  63.     next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
  64.     *prev=next;
  65.   }
  66.   point= (gptr) ((char*) next+ (next->size-next->left));
  67.   next->left-= Size;
  68.  
  69.   return(point);
  70. } /* my_once_alloc */
  71.  
  72.  
  73.     /* deallocate everything used by my_once_alloc */
  74.  
  75. void my_once_free(void)
  76. {
  77.   reg1 USED_MEM *next,*old;
  78.   DBUG_ENTER("my_once_free");
  79.  
  80.   for (next=my_once_root_block ; next ; )
  81.   {
  82.     old=next; next= next->next ;
  83.     free((gptr) old);
  84.   }
  85.   my_once_root_block=0;
  86.  
  87.   DBUG_VOID_RETURN;
  88. } /* my_once_free */
  89.