mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 13:02:28 +01:00
Merge heikki@work.mysql.com:/home/my/mysql
into donna.mysql.fi:/home/heikki/mysqlf
This commit is contained in:
commit
a24fbc61ba
6 changed files with 167 additions and 27 deletions
|
@ -170,7 +170,9 @@ mem_heap_alloc(
|
|||
buf = (byte*)buf + MEM_FIELD_HEADER_SIZE;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(buf, '\0', n);
|
||||
#endif
|
||||
return(buf);
|
||||
}
|
||||
|
||||
|
@ -494,8 +496,14 @@ mem_alloc_func(
|
|||
)
|
||||
{
|
||||
#ifndef UNIV_MEM_DEBUG
|
||||
void* buf;
|
||||
|
||||
return(mem_area_alloc(n, mem_comm_pool));
|
||||
buf = mem_area_alloc(n, mem_comm_pool);
|
||||
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(buf, '\0', n);
|
||||
#endif
|
||||
return(buf);
|
||||
|
||||
#else
|
||||
|
||||
|
|
|
@ -26,12 +26,39 @@ int
|
|||
ut_memcmp(void* str1, void* str2, ulint n);
|
||||
|
||||
|
||||
void*
|
||||
ut_malloc(ulint n);
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined and set_to_zero is TRUE. */
|
||||
|
||||
void*
|
||||
ut_malloc_low(
|
||||
/*==========*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n, /* in: number of bytes to allocate */
|
||||
ibool set_to_zero); /* in: TRUE if allocated memory should be set
|
||||
to zero if UNIV_SET_MEM_TO_ZERO is defined */
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined. */
|
||||
|
||||
void*
|
||||
ut_malloc(
|
||||
/*======*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n); /* in: number of bytes to allocate */
|
||||
/**************************************************************************
|
||||
Frees a memory bloock allocated with ut_malloc. */
|
||||
|
||||
UNIV_INLINE
|
||||
void
|
||||
ut_free(void* ptr);
|
||||
ut_free(
|
||||
/*====*/
|
||||
void* ptr); /* in, own: memory block */
|
||||
/**************************************************************************
|
||||
Frees all allocated memory not freed yet. */
|
||||
|
||||
void
|
||||
ut_free_all_mem(void);
|
||||
/*=================*/
|
||||
|
||||
UNIV_INLINE
|
||||
char*
|
||||
|
|
|
@ -27,13 +27,6 @@ ut_memcmp(void* str1, void* str2, ulint n)
|
|||
return(memcmp(str1, str2, n));
|
||||
}
|
||||
|
||||
UNIV_INLINE
|
||||
void
|
||||
ut_free(void* ptr)
|
||||
{
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
UNIV_INLINE
|
||||
char*
|
||||
ut_strcpy(char* dest, char* sour)
|
||||
|
|
|
@ -170,7 +170,11 @@ mem_pool_create(
|
|||
|
||||
pool = ut_malloc(sizeof(mem_pool_t));
|
||||
|
||||
pool->buf = ut_malloc(size);
|
||||
/* We do not set the memory to zero (FALSE) in the pool,
|
||||
but only when allocated at a higher level in mem0mem.c.
|
||||
This is to avoid masking useful Purify warnings. */
|
||||
|
||||
pool->buf = ut_malloc_low(size, FALSE);
|
||||
pool->size = size;
|
||||
|
||||
mutex_create(&(pool->mutex));
|
||||
|
|
|
@ -916,5 +916,7 @@ innobase_shutdown_for_mysql(void)
|
|||
|
||||
logs_empty_and_mark_files_at_shutdown();
|
||||
|
||||
ut_free_all_mem();
|
||||
|
||||
return((int) DB_SUCCESS);
|
||||
}
|
||||
|
|
|
@ -14,30 +14,136 @@ Created 5/11/1994 Heikki Tuuri
|
|||
|
||||
#include "mem0mem.h"
|
||||
|
||||
|
||||
/* This struct is placed first in every allocated memory block */
|
||||
typedef struct ut_mem_block_struct ut_mem_block_t;
|
||||
|
||||
struct ut_mem_block_struct{
|
||||
UT_LIST_NODE_T(ut_mem_block_t) mem_block_list;/* mem block list node */
|
||||
};
|
||||
|
||||
|
||||
/* List of all memory blocks allocated from the operating system
|
||||
with malloc */
|
||||
UT_LIST_BASE_NODE_T(ut_mem_block_t) ut_mem_block_list;
|
||||
|
||||
os_fast_mutex_t ut_list_mutex; /* this protects the list */
|
||||
|
||||
ibool ut_mem_block_list_inited = FALSE;
|
||||
|
||||
/**************************************************************************
|
||||
Initializes the mem block list at database startup. */
|
||||
static
|
||||
void
|
||||
ut_mem_block_list_init(void)
|
||||
/*========================*/
|
||||
{
|
||||
os_fast_mutex_init(&ut_list_mutex);
|
||||
UT_LIST_INIT(ut_mem_block_list);
|
||||
ut_mem_block_list_inited = TRUE;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined and set_to_zero is TRUE. */
|
||||
|
||||
void*
|
||||
ut_malloc(ulint n)
|
||||
ut_malloc_low(
|
||||
/*==========*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n, /* in: number of bytes to allocate */
|
||||
ibool set_to_zero) /* in: TRUE if allocated memory should be set
|
||||
to zero if UNIV_SET_MEM_TO_ZERO is defined */
|
||||
{
|
||||
void* ret;
|
||||
/*
|
||||
ret = VirtualAlloc(NULL, n, MEM_COMMIT, PAGE_READWRITE);
|
||||
*/
|
||||
|
||||
ret = malloc(n);
|
||||
ut_ad((sizeof(ut_mem_block_t) % 8) == 0); /* check alignment ok */
|
||||
|
||||
if (!ut_mem_block_list_inited) {
|
||||
ut_mem_block_list_init();
|
||||
}
|
||||
|
||||
os_fast_mutex_lock(&ut_list_mutex);
|
||||
|
||||
ret = malloc(n + sizeof(ut_mem_block_t));
|
||||
|
||||
if (ret == NULL) {
|
||||
fprintf(stderr,
|
||||
"Innobase: Fatal error: cannot allocate memory!\n");
|
||||
fprintf(stderr,
|
||||
"Innobase: Cannot continue operation!\n");
|
||||
fprintf(stderr,
|
||||
"Innobase: Check if you can increase the swap file of your\n");
|
||||
fprintf(stderr,
|
||||
"Innobase: operating system.\n");
|
||||
"InnoDB: Fatal error: cannot allocate %lu bytes of\n"
|
||||
"InnoDB: memory with malloc!\n"
|
||||
"InnoDB: Operating system errno: %lu\n"
|
||||
"InnoDB: Cannot continue operation!\n"
|
||||
"InnoDB: Check if you should increase the swap file or\n"
|
||||
"InnoDB: ulimits of your operating system.\n", n, errno);
|
||||
|
||||
os_fast_mutex_unlock(&ut_list_mutex);
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return(ret);
|
||||
if (set_to_zero) {
|
||||
#ifdef UNIV_SET_MEM_TO_ZERO
|
||||
memset(ret, '\0', n + sizeof(ut_mem_block_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
UT_LIST_ADD_FIRST(mem_block_list, ut_mem_block_list,
|
||||
((ut_mem_block_t*)ret));
|
||||
os_fast_mutex_unlock(&ut_list_mutex);
|
||||
|
||||
return((void*)((byte*)ret + sizeof(ut_mem_block_t)));
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Allocates memory. Sets it also to zero if UNIV_SET_MEM_TO_ZERO is
|
||||
defined. */
|
||||
|
||||
void*
|
||||
ut_malloc(
|
||||
/*======*/
|
||||
/* out, own: allocated memory */
|
||||
ulint n) /* in: number of bytes to allocate */
|
||||
{
|
||||
return(ut_malloc_low(n, TRUE));
|
||||
}
|
||||
/**************************************************************************
|
||||
Frees a memory bloock allocated with ut_malloc. */
|
||||
|
||||
void
|
||||
ut_free(
|
||||
/*====*/
|
||||
void* ptr) /* in, own: memory block */
|
||||
{
|
||||
ut_mem_block_t* block;
|
||||
|
||||
block = (ut_mem_block_t*)((byte*)ptr - sizeof(ut_mem_block_t));
|
||||
|
||||
os_fast_mutex_lock(&ut_list_mutex);
|
||||
|
||||
UT_LIST_REMOVE(mem_block_list, ut_mem_block_list, block);
|
||||
free(block);
|
||||
|
||||
os_fast_mutex_unlock(&ut_list_mutex);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
Frees all allocated memory not freed yet. */
|
||||
|
||||
void
|
||||
ut_free_all_mem(void)
|
||||
/*=================*/
|
||||
{
|
||||
ut_mem_block_t* block;
|
||||
|
||||
os_fast_mutex_lock(&ut_list_mutex);
|
||||
|
||||
while (block = UT_LIST_GET_FIRST(ut_mem_block_list)) {
|
||||
|
||||
UT_LIST_REMOVE(mem_block_list, ut_mem_block_list, block);
|
||||
free(block);
|
||||
}
|
||||
|
||||
os_fast_mutex_unlock(&ut_list_mutex);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
Loading…
Reference in a new issue