summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty <monty@mariadb.org>2018-09-05 17:34:26 +0300
committerMonty <monty@mariadb.org>2018-09-05 17:34:26 +0300
commitf180af1cbbd8c63cea87034d14e2a681aba8c019 (patch)
treed0dc2ff814920e67819d2ef7af94bee43ca7fcde
parenta2db8785a5c28e9aea2f7255b697ae112a9e35a9 (diff)
downloadmariadb-git-f180af1cbbd8c63cea87034d14e2a681aba8c019.tar.gz
Store pointer to mem_root and mem_root name at start of each memroot block
-rw-r--r--mysys/my_alloc.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c
index 7139466be17..7cbf99baa39 100644
--- a/mysys/my_alloc.c
+++ b/mysys/my_alloc.c
@@ -78,14 +78,17 @@ void init_alloc_root(MEM_ROOT *mem_root, const char *name, size_t block_size,
if (pre_alloc_size)
{
if ((mem_root->free= mem_root->pre_alloc=
- (USED_MEM*) my_malloc(pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM)),
+ (USED_MEM*) my_malloc(pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM)) +
+ ALIGN_SIZE(strlen(mem_root->name)+ 1 + sizeof(mem_root)),
MYF(my_flags))))
{
- mem_root->free->size= pre_alloc_size+ALIGN_SIZE(sizeof(USED_MEM));
- mem_root->total_alloc= pre_alloc_size+ALIGN_SIZE(sizeof(USED_MEM));
+ mem_root->free->size= pre_alloc_size+ALIGN_SIZE(sizeof(USED_MEM)) + ALIGN_SIZE(strlen(mem_root->name)+ 1 + sizeof(mem_root));
+ mem_root->total_alloc= pre_alloc_size+ALIGN_SIZE(sizeof(USED_MEM)) + ALIGN_SIZE(strlen(mem_root->name)+ 1 + sizeof(mem_root));
mem_root->free->left= pre_alloc_size;
mem_root->free->next= 0;
TRASH_MEM(mem_root->free);
+ memcpy((mem_root->free+1), &mem_root, sizeof(mem_root));
+ strmov(((char*) (mem_root->free + 1)) + sizeof(mem_root), mem_root->name);
}
}
#endif
@@ -120,7 +123,7 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
#if !(defined(HAVE_valgrind) && defined(EXTRA_DEBUG))
if (pre_alloc_size)
{
- size_t size= pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM));
+ size_t size= pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM)) + ALIGN_SIZE(strlen(mem_root->name) + 1 + sizeof(mem_root));
if (!mem_root->pre_alloc || mem_root->pre_alloc->size != size)
{
USED_MEM *mem, **prev= &mem_root->free;
@@ -158,6 +161,8 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
mem->next= *prev;
*prev= mem_root->pre_alloc= mem;
TRASH_MEM(mem);
+ memcpy((mem+1), &mem_root, sizeof(mem_root));
+ strmov(((char*) (mem + 1)) + sizeof(mem_root), mem_root->name);
}
else
{
@@ -243,7 +248,7 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
if (! next)
{ /* Time to alloc new block */
block_size= (mem_root->block_size & ~1) * (mem_root->block_num >> 2);
- get_size= length+ALIGN_SIZE(sizeof(USED_MEM));
+ get_size= length+ALIGN_SIZE(sizeof(USED_MEM)) + ALIGN_SIZE(strlen(mem_root->name)+ 1 + sizeof(mem_root));
get_size= MY_MAX(get_size, block_size);
if (!(next = (USED_MEM*) my_malloc(get_size,
@@ -259,9 +264,11 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
mem_root->total_alloc+= get_size;
next->next= *prev;
next->size= get_size;
- next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
+ next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM)) - ALIGN_SIZE(strlen(mem_root->name)+ 1 + sizeof(mem_root));
*prev=next;
TRASH_MEM(next);
+ memcpy((void*) (next+1), &mem_root, sizeof(mem_root));
+ strmov(((char*) (next+1)) + sizeof(mem_root), mem_root->name);
}
point= (uchar*) ((char*) next+ (next->size-next->left));
@@ -347,8 +354,10 @@ static inline void mark_blocks_free(MEM_ROOT* root)
last= &root->free;
for (next= root->free; next; next= *(last= &next->next))
{
- next->left= next->size - ALIGN_SIZE(sizeof(USED_MEM));
+ next->left= next->size - ALIGN_SIZE(sizeof(USED_MEM)) - ALIGN_SIZE(strlen(root->name)+ 1 + sizeof(root));
TRASH_MEM(next);
+ memcpy((void*) (next+1), &root, sizeof(root));
+ strmov(((char*) (next+1)) + sizeof(root), root->name);
}
/* Combine the free and the used list */
@@ -357,8 +366,10 @@ static inline void mark_blocks_free(MEM_ROOT* root)
/* now go through the used blocks and mark them free */
for (; next; next= next->next)
{
- next->left= next->size - ALIGN_SIZE(sizeof(USED_MEM));
+ next->left= next->size - ALIGN_SIZE(sizeof(USED_MEM)) - ALIGN_SIZE(strlen(root->name)+ 1 + sizeof(root));
TRASH_MEM(next);
+ memcpy((void*) (next+1), &root, sizeof(root));
+ strmov(((char*) (next+1)) + sizeof(root), root->name);
}
/* Now everything is set; Indicate that nothing is used anymore */
@@ -431,8 +442,10 @@ void free_root(MEM_ROOT *root, myf MyFlags)
if (root->pre_alloc)
{
root->free=root->pre_alloc;
- root->free->left=root->pre_alloc->size-ALIGN_SIZE(sizeof(USED_MEM));
+ root->free->left=root->pre_alloc->size-ALIGN_SIZE(sizeof(USED_MEM)) - ALIGN_SIZE(strlen(root->name)+ 1 + sizeof(root));
TRASH_MEM(root->pre_alloc);
+ memcpy((void*) (root->free+1), &root, sizeof(root));
+ strmov(((char*) (root->free+1)) + sizeof(root), root->name);
root->free->next=0;
}
root->block_num= 4;