my_once.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

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