mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
0d4be10a8a
This patch adds support for controlling of memory allocation done by SP/PS that could happen on second and following executions. As soon as SP or PS has been executed the first time its memory root is marked as read only since no further memory allocation should be performed on it. In case such allocation takes place it leads to the assert hit for invariant that force no new memory allocations takes place as soon as the SP/PS has been marked as read only. The feature for control of memory allocation made on behalf SP/PS is turned on when both debug build is on and the cmake option -DWITH_PROTECT_STATEMENT_MEMROOT is set. The reason for introduction of the new cmake option -DWITH_PROTECT_STATEMENT_MEMROOT to control memory allocation of second and following executions of SP/PS is that for the current server implementation there are too many places where such memory allocation takes place. As soon as all such incorrect allocations be fixed the cmake option -DWITH_PROTECT_STATEMENT_MEMROOT can be removed and control of memory allocation made on second and following executions can be turned on only for debug build. Before every incorrect memory allocation be fixed it makes sense to guard the checking of memory allocation on read only memory by extra cmake option else we would get a lot of failing test on buildbot. Moreover, fixing of all incorrect memory allocations could take pretty long period of time, so for introducing the feature without necessary to wait until all places throughout the source code be fixed it makes sense to add the new cmake option.
66 lines
2 KiB
C
66 lines
2 KiB
C
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
|
|
|
/*
|
|
Data structures for mysys/my_alloc.c (root memory allocator)
|
|
*/
|
|
|
|
#ifndef _my_alloc_h
|
|
#define _my_alloc_h
|
|
|
|
#define ALLOC_MAX_BLOCK_TO_DROP 4096
|
|
#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct st_used_mem
|
|
{ /* struct for once_alloc (block) */
|
|
struct st_used_mem *next; /* Next block in use */
|
|
size_t left; /* memory left in block */
|
|
size_t size; /* size of block */
|
|
} USED_MEM;
|
|
|
|
|
|
typedef struct st_mem_root
|
|
{
|
|
USED_MEM *free; /* blocks with free memory in it */
|
|
USED_MEM *used; /* blocks almost without free memory */
|
|
USED_MEM *pre_alloc; /* preallocated block */
|
|
/* if block have less memory it will be put in 'used' list */
|
|
size_t min_malloc;
|
|
size_t block_size; /* initial block size */
|
|
size_t total_alloc;
|
|
unsigned int block_num; /* allocated blocks counter */
|
|
/*
|
|
first free block in queue test counter (if it exceed
|
|
MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list)
|
|
*/
|
|
unsigned int first_block_usage;
|
|
|
|
#ifdef PROTECT_STATEMENT_MEMROOT
|
|
int read_only;
|
|
#endif
|
|
|
|
void (*error_handler)(void);
|
|
const char *name;
|
|
} MEM_ROOT;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|