Commit 0ddfb66f authored by Jimmy Yang's avatar Jimmy Yang

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

rb://339, approved by Sunny Bains.
parent 930e66c2
...@@ -100,18 +100,6 @@ mem_pool_get_reserved( ...@@ -100,18 +100,6 @@ mem_pool_get_reserved(
/*==================*/ /*==================*/
mem_pool_t* pool); /*!< in: memory pool */ 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. Validates a memory pool.
@return TRUE if ok */ @return TRUE if ok */
UNIV_INTERN UNIV_INTERN
......
...@@ -367,7 +367,7 @@ mem_heap_create_block( ...@@ -367,7 +367,7 @@ mem_heap_create_block(
block->line = line; block->line = line;
#ifdef MEM_PERIODIC_CHECK #ifdef MEM_PERIODIC_CHECK
mem_pool_mutex_enter(); mutex_enter(&(mem_comm_pool->mutex));
if (!mem_block_list_inited) { if (!mem_block_list_inited) {
mem_block_list_inited = TRUE; mem_block_list_inited = TRUE;
...@@ -376,7 +376,7 @@ mem_heap_create_block( ...@@ -376,7 +376,7 @@ mem_heap_create_block(
UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block); UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block);
mem_pool_mutex_exit(); mutex_exit(&(mem_comm_pool->mutex));
#endif #endif
mem_block_set_len(block, len); mem_block_set_len(block, len);
mem_block_set_type(block, type); mem_block_set_type(block, type);
...@@ -479,11 +479,11 @@ mem_heap_block_free( ...@@ -479,11 +479,11 @@ mem_heap_block_free(
UT_LIST_REMOVE(list, heap->base, block); UT_LIST_REMOVE(list, heap->base, block);
#ifdef MEM_PERIODIC_CHECK #ifdef MEM_PERIODIC_CHECK
mem_pool_mutex_enter(); mutex_enter(&(mem_comm_pool->mutex));
UT_LIST_REMOVE(mem_block_list, mem_block_list, block); UT_LIST_REMOVE(mem_block_list, mem_block_list, block);
mem_pool_mutex_exit(); mutex_exit(&(mem_comm_pool->mutex));
#endif #endif
ut_ad(heap->total_size >= block->len); ut_ad(heap->total_size >= block->len);
...@@ -556,7 +556,7 @@ mem_validate_all_blocks(void) ...@@ -556,7 +556,7 @@ mem_validate_all_blocks(void)
{ {
mem_block_t* block; mem_block_t* block;
mem_pool_mutex_enter(); mutex_enter(&(mem_comm_pool->mutex));
block = UT_LIST_GET_FIRST(mem_block_list); block = UT_LIST_GET_FIRST(mem_block_list);
...@@ -568,6 +568,6 @@ mem_validate_all_blocks(void) ...@@ -568,6 +568,6 @@ mem_validate_all_blocks(void)
block = UT_LIST_GET_NEXT(mem_block_list, block); block = UT_LIST_GET_NEXT(mem_block_list, block);
} }
mem_pool_mutex_exit(); mutex_exit(&(mem_comm_pool->mutex));
} }
#endif #endif
...@@ -34,6 +34,7 @@ Created 5/12/1997 Heikki Tuuri ...@@ -34,6 +34,7 @@ Created 5/12/1997 Heikki Tuuri
#include "ut0lst.h" #include "ut0lst.h"
#include "ut0byte.h" #include "ut0byte.h"
#include "mem0mem.h" #include "mem0mem.h"
#include "srv0start.h"
/* We would like to use also the buffer frames to allocate memory. This /* We would like to use also the buffer frames to allocate memory. This
would be desirable, because then the memory consumption of the database would be desirable, because then the memory consumption of the database
...@@ -126,23 +127,33 @@ mysql@lists.mysql.com */ ...@@ -126,23 +127,33 @@ mysql@lists.mysql.com */
UNIV_INTERN ulint mem_n_threads_inside = 0; UNIV_INTERN ulint mem_n_threads_inside = 0;
/********************************************************************//** /********************************************************************//**
Reserves the mem pool mutex. */ Reserves the mem pool mutex if we are not in server shutdown. Use
UNIV_INTERN this function only in memory free functions, since only memory
free functions are used during server shutdown. */
UNIV_INLINE
void 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. */ Releases the mem pool mutex if we are not in server shutdown. As
UNIV_INTERN its corresponding mem_pool_mutex_enter() function, use it only
in memory free functions */
UNIV_INLINE
void 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( ...@@ -572,7 +583,7 @@ mem_area_free(
n = ut_2_log(size); n = ut_2_log(size);
mutex_enter(&(pool->mutex)); mem_pool_mutex_enter(pool);
mem_n_threads_inside++; mem_n_threads_inside++;
ut_a(mem_n_threads_inside == 1); ut_a(mem_n_threads_inside == 1);
...@@ -600,7 +611,7 @@ mem_area_free( ...@@ -600,7 +611,7 @@ mem_area_free(
pool->reserved += ut_2_exp(n); pool->reserved += ut_2_exp(n);
mem_n_threads_inside--; mem_n_threads_inside--;
mutex_exit(&(pool->mutex)); mem_pool_mutex_exit(pool);
mem_area_free(new_ptr, pool); mem_area_free(new_ptr, pool);
...@@ -616,7 +627,7 @@ mem_area_free( ...@@ -616,7 +627,7 @@ mem_area_free(
} }
mem_n_threads_inside--; mem_n_threads_inside--;
mutex_exit(&(pool->mutex)); mem_pool_mutex_exit(pool);
ut_ad(mem_pool_validate(pool)); ut_ad(mem_pool_validate(pool));
} }
...@@ -635,7 +646,7 @@ mem_pool_validate( ...@@ -635,7 +646,7 @@ mem_pool_validate(
ulint free; ulint free;
ulint i; ulint i;
mutex_enter(&(pool->mutex)); mem_pool_mutex_enter(pool);
free = 0; free = 0;
...@@ -663,7 +674,7 @@ mem_pool_validate( ...@@ -663,7 +674,7 @@ mem_pool_validate(
ut_a(free + pool->reserved == pool->size); ut_a(free + pool->reserved == pool->size);
mutex_exit(&(pool->mutex)); mem_pool_mutex_exit(pool);
return(TRUE); return(TRUE);
} }
......
...@@ -2093,9 +2093,13 @@ innobase_shutdown_for_mysql(void) ...@@ -2093,9 +2093,13 @@ innobase_shutdown_for_mysql(void)
pars_lexer_close(); pars_lexer_close();
log_mem_free(); log_mem_free();
buf_pool_free(srv_buf_pool_instances); buf_pool_free(srv_buf_pool_instances);
ut_free_all_mem();
mem_close(); 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 if (os_thread_count != 0
|| os_event_count != 0 || os_event_count != 0
|| os_mutex_count != 0 || os_mutex_count != 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment