Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00023 #pragma once
00024
00025 #include <cstddef>
00026
00027 #include <drizzled/definitions.h>
00028
00029 #include <drizzled/visibility.h>
00030
00031 namespace drizzled
00032 {
00033
00042 namespace memory
00043 {
00044
00045 static const int KEEP_PREALLOC= 1;
00046
00047 static const int MARK_BLOCKS_FREE= 2;
00048
00049 namespace internal
00050 {
00051
00052 class UsedMemory
00053 {
00054 public:
00055 UsedMemory *next;
00056 size_t left;
00057 size_t size;
00058 };
00059
00060 }
00061
00062 static const size_t ROOT_MIN_BLOCK_SIZE= (MALLOC_OVERHEAD + sizeof(internal::UsedMemory) + 8);
00063
00064
00065
00066 class DRIZZLED_API Root
00067 {
00068 public:
00069
00070 Root() :
00071 free(0),
00072 used(0),
00073 pre_alloc(0),
00074 min_malloc(0),
00075 block_size(0),
00076 block_num(0),
00077 first_block_usage(0),
00078 error_handler(0)
00079 { }
00080
00081 Root(size_t block_size_arg)
00082 {
00083 free= used= pre_alloc= 0;
00084 min_malloc= 32;
00085 block_size= block_size_arg - memory::ROOT_MIN_BLOCK_SIZE;
00086 block_num= 4;
00087 first_block_usage= 0;
00088 error_handler= 0;
00089 }
00090
00091 ~Root();
00092
00096 internal::UsedMemory *free;
00097
00101 internal::UsedMemory *used;
00102
00106 internal::UsedMemory *pre_alloc;
00107
00111 size_t min_malloc;
00112
00113 size_t block_size;
00114 unsigned int block_num;
00115
00120 unsigned int first_block_usage;
00121
00122 void (*error_handler)(void);
00123 void reset_root_defaults(size_t block_size, size_t prealloc_size);
00124 void *alloc_root(size_t Size);
00125 inline void *allocate(size_t Size)
00126 {
00127 return alloc_root(Size);
00128 }
00129 void mark_blocks_free();
00130 void *memdup_root(const void *str, size_t len);
00131 char *strdup_root(const char *str);
00132
00133 char *strmake_root(const char *str,size_t len);
00134 void init_alloc_root(size_t block_size= ROOT_MIN_BLOCK_SIZE);
00135
00136 inline void *duplicate(const void *str, size_t len)
00137 {
00138 return memdup_root(str, len);
00139 }
00140
00141 inline bool alloc_root_inited()
00142 {
00143 return min_malloc != 0;
00144 }
00145 void free_root(myf MyFLAGS);
00146 void *multi_alloc_root(int unused, ...);
00147 };
00148
00149 }
00150 }
00151