diff options
author | Monty <monty@mariadb.org> | 2018-09-05 17:34:26 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2018-09-05 17:34:26 +0300 |
commit | f180af1cbbd8c63cea87034d14e2a681aba8c019 (patch) | |
tree | d0dc2ff814920e67819d2ef7af94bee43ca7fcde | |
parent | a2db8785a5c28e9aea2f7255b697ae112a9e35a9 (diff) | |
download | mariadb-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.c | 31 |
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; |