~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/memory/root.h

Merge Monty

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
#ifndef DRIZZLED_MEMORY_ROOT_H
18
18
#define DRIZZLED_MEMORY_ROOT_H
19
19
 
20
 
#include <stddef.h>
 
20
#include <cstddef>
21
21
 
22
22
#include <drizzled/definitions.h>
23
23
 
25
25
extern "C" {
26
26
#endif
27
27
 
28
 
#define MY_KEEP_PREALLOC        1
29
 
#define MY_MARK_BLOCKS_FREE     2  /* move used to free list and reuse them */
30
 
 
31
 
#define alloc_root_inited(A) ((A)->min_malloc != 0)
32
 
#define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8)
33
 
#define ALLOC_MAX_BLOCK_TO_DROP                 4096
34
 
#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP       10
35
 
 
36
 
typedef struct st_used_mem
37
 
{                                  /* struct for once_alloc (block) */
38
 
  struct st_used_mem *next;        /* Next block in use */
39
 
  size_t left;                     /* memory left in block  */            
40
 
  size_t size;                     /* size of block */
41
 
} USED_MEM;
42
 
 
43
 
 
44
 
typedef struct st_mem_root
45
 
{
46
 
  USED_MEM *free;                  /* blocks with free memory in it */
47
 
  USED_MEM *used;                  /* blocks almost without free memory */
48
 
  USED_MEM *pre_alloc;             /* preallocated block */
 
28
namespace drizzled
 
29
{
 
30
namespace memory
 
31
{
 
32
 
 
33
static const int KEEP_PREALLOC= 1;
 
34
/* move used to free list and reuse them */
 
35
static const int MARK_BLOCKS_FREE= 2;
 
36
 
 
37
namespace internal
 
38
{
 
39
 
 
40
class UsedMemory
 
41
{                          /* struct for once_alloc (block) */
 
42
public:
 
43
  UsedMemory *next;        /* Next block in use */
 
44
  size_t left;             /* memory left in block  */            
 
45
  size_t size;             /* size of block */
 
46
};
 
47
 
 
48
}
 
49
 
 
50
static const size_t ROOT_MIN_BLOCK_SIZE= (MALLOC_OVERHEAD + sizeof(internal::UsedMemory) + 8);
 
51
 
 
52
 
 
53
 
 
54
class Root
 
55
{
 
56
public:
 
57
  /* blocks with free memory in it */
 
58
  internal::UsedMemory *free;
 
59
 
 
60
  /* blocks almost without free memory */
 
61
  internal::UsedMemory *used;
 
62
 
 
63
  /* preallocated block */
 
64
  internal::UsedMemory *pre_alloc;
 
65
 
49
66
  /* if block have less memory it will be put in 'used' list */
50
67
  size_t min_malloc;
51
68
  size_t block_size;               /* initial block size */
57
74
  unsigned int first_block_usage;
58
75
 
59
76
  void (*error_handler)(void);
60
 
} MEM_ROOT;
61
 
 
62
 
void init_alloc_root(MEM_ROOT *mem_root, size_t block_size,
63
 
                     size_t pre_alloc_size);
64
 
void *alloc_root(MEM_ROOT *mem_root, size_t Size);
65
 
void *multi_alloc_root(MEM_ROOT *mem_root, ...);
66
 
void free_root(MEM_ROOT *root, myf MyFLAGS);
67
 
void set_prealloc_root(MEM_ROOT *root, char *ptr);
68
 
void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
 
77
};
 
78
 
 
79
inline static bool alloc_root_inited(Root *root)
 
80
{
 
81
  return root->min_malloc != 0;
 
82
}
 
83
 
 
84
void init_alloc_root(Root *mem_root,
 
85
                     size_t block_size= ROOT_MIN_BLOCK_SIZE);
 
86
void *alloc_root(Root *mem_root, size_t Size);
 
87
void *multi_alloc_root(Root *mem_root, ...);
 
88
void free_root(Root *root, myf MyFLAGS);
 
89
void set_prealloc_root(Root *root, char *ptr);
 
90
void reset_root_defaults(Root *mem_root, size_t block_size,
69
91
                         size_t prealloc_size);
70
 
char *strdup_root(MEM_ROOT *root,const char *str);
71
 
char *strmake_root(MEM_ROOT *root,const char *str,size_t len);
72
 
void *memdup_root(MEM_ROOT *root,const void *str, size_t len);
 
92
char *strdup_root(Root *root,const char *str);
 
93
char *strmake_root(Root *root,const char *str,size_t len);
 
94
void *memdup_root(Root *root,const void *str, size_t len);
 
95
 
 
96
}
 
97
}
73
98
 
74
99
#if defined(__cplusplus)
75
100
}