Fix bug #52546, crash on shutdown of plugin with innodb_use_sys_malloc=0.

rb://339, approved by Sunny Bains.
This commit is contained in:
Jimmy Yang 2010-05-17 01:57:42 -07:00
commit d754b57199
4 changed files with 37 additions and 34 deletions

View file

@ -100,18 +100,6 @@ mem_pool_get_reserved(
/*==================*/
mem_pool_t* pool); /*!< in: memory pool */
/********************************************************************//**
Reserves the mem pool mutex. */
UNIV_INTERN
void
mem_pool_mutex_enter(void);
/*======================*/
/********************************************************************//**
Releases the mem pool mutex. */
UNIV_INTERN
void
mem_pool_mutex_exit(void);
/*=====================*/
/********************************************************************//**
Validates a memory pool.
@return TRUE if ok */
UNIV_INTERN

View file

@ -367,7 +367,7 @@ mem_heap_create_block(
block->line = line;
#ifdef MEM_PERIODIC_CHECK
mem_pool_mutex_enter();
mutex_enter(&(mem_comm_pool->mutex));
if (!mem_block_list_inited) {
mem_block_list_inited = TRUE;
@ -376,7 +376,7 @@ mem_heap_create_block(
UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block);
mem_pool_mutex_exit();
mutex_exit(&(mem_comm_pool->mutex));
#endif
mem_block_set_len(block, len);
mem_block_set_type(block, type);
@ -479,11 +479,11 @@ mem_heap_block_free(
UT_LIST_REMOVE(list, heap->base, block);
#ifdef MEM_PERIODIC_CHECK
mem_pool_mutex_enter();
mutex_enter(&(mem_comm_pool->mutex));
UT_LIST_REMOVE(mem_block_list, mem_block_list, block);
mem_pool_mutex_exit();
mutex_exit(&(mem_comm_pool->mutex));
#endif
ut_ad(heap->total_size >= block->len);
@ -556,7 +556,7 @@ mem_validate_all_blocks(void)
{
mem_block_t* block;
mem_pool_mutex_enter();
mutex_enter(&(mem_comm_pool->mutex));
block = UT_LIST_GET_FIRST(mem_block_list);
@ -568,6 +568,6 @@ mem_validate_all_blocks(void)
block = UT_LIST_GET_NEXT(mem_block_list, block);
}
mem_pool_mutex_exit();
mutex_exit(&(mem_comm_pool->mutex));
}
#endif

View file

@ -34,6 +34,7 @@ Created 5/12/1997 Heikki Tuuri
#include "ut0lst.h"
#include "ut0byte.h"
#include "mem0mem.h"
#include "srv0start.h"
/* We would like to use also the buffer frames to allocate memory. This
would be desirable, because then the memory consumption of the database
@ -126,23 +127,33 @@ mysql@lists.mysql.com */
UNIV_INTERN ulint mem_n_threads_inside = 0;
/********************************************************************//**
Reserves the mem pool mutex. */
UNIV_INTERN
Reserves the mem pool mutex if we are not in server shutdown. Use
this function only in memory free functions, since only memory
free functions are used during server shutdown. */
UNIV_INLINE
void
mem_pool_mutex_enter(void)
/*======================*/
mem_pool_mutex_enter(
/*=================*/
mem_pool_t* pool) /*!< in: memory pool */
{
mutex_enter(&(mem_comm_pool->mutex));
if (srv_shutdown_state < SRV_SHUTDOWN_EXIT_THREADS) {
mutex_enter(&(pool->mutex));
}
}
/********************************************************************//**
Releases the mem pool mutex. */
UNIV_INTERN
Releases the mem pool mutex if we are not in server shutdown. As
its corresponding mem_pool_mutex_enter() function, use it only
in memory free functions */
UNIV_INLINE
void
mem_pool_mutex_exit(void)
/*=====================*/
mem_pool_mutex_exit(
/*================*/
mem_pool_t* pool) /*!< in: memory pool */
{
mutex_exit(&(mem_comm_pool->mutex));
if (srv_shutdown_state < SRV_SHUTDOWN_EXIT_THREADS) {
mutex_exit(&(pool->mutex));
}
}
/********************************************************************//**
@ -572,7 +583,7 @@ mem_area_free(
n = ut_2_log(size);
mutex_enter(&(pool->mutex));
mem_pool_mutex_enter(pool);
mem_n_threads_inside++;
ut_a(mem_n_threads_inside == 1);
@ -600,7 +611,7 @@ mem_area_free(
pool->reserved += ut_2_exp(n);
mem_n_threads_inside--;
mutex_exit(&(pool->mutex));
mem_pool_mutex_exit(pool);
mem_area_free(new_ptr, pool);
@ -616,7 +627,7 @@ mem_area_free(
}
mem_n_threads_inside--;
mutex_exit(&(pool->mutex));
mem_pool_mutex_exit(pool);
ut_ad(mem_pool_validate(pool));
}
@ -635,7 +646,7 @@ mem_pool_validate(
ulint free;
ulint i;
mutex_enter(&(pool->mutex));
mem_pool_mutex_enter(pool);
free = 0;
@ -663,7 +674,7 @@ mem_pool_validate(
ut_a(free + pool->reserved == pool->size);
mutex_exit(&(pool->mutex));
mem_pool_mutex_exit(pool);
return(TRUE);
}

View file

@ -2093,9 +2093,13 @@ innobase_shutdown_for_mysql(void)
pars_lexer_close();
log_mem_free();
buf_pool_free(srv_buf_pool_instances);
ut_free_all_mem();
mem_close();
/* ut_free_all_mem() frees all allocated memory not freed yet
in shutdown, and it will also free the ut_list_mutex, so it
should be the last one for all operation */
ut_free_all_mem();
if (os_thread_count != 0
|| os_event_count != 0
|| os_mutex_count != 0