mirror of
https://github.com/MariaDB/server.git
synced 2026-05-09 08:34:28 +02:00
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:
parent
a6142ed8e4
commit
d754b57199
4 changed files with 37 additions and 34 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue