diff options
author | unknown <heikki@donna.mysql.fi> | 2002-02-04 23:55:41 +0200 |
---|---|---|
committer | unknown <heikki@donna.mysql.fi> | 2002-02-04 23:55:41 +0200 |
commit | 9871a6d080f507f58afa91bfd7624c27b27963cd (patch) | |
tree | 8afb00e0a5c01501d06fda6b055c26e219075b91 /innobase/mem | |
parent | 3518de828d1c7c384ea3503ae2ce1477bf4a9095 (diff) | |
download | mariadb-git-9871a6d080f507f58afa91bfd7624c27b27963cd.tar.gz |
Many files:
Small improvements
row0mysql.c:
Small improvements + fix the ALTER TABLE problem by introducing a lazy drop table it can use
ha_innobase.cc:
Some fine-tuning of optimization
sql/ha_innobase.cc:
Some fine-tuning of optimization
innobase/include/log0recv.h:
Small improvements
innobase/include/mem0mem.h:
Small improvements
innobase/include/mem0pool.h:
Small improvements
innobase/include/row0mysql.h:
Small improvements
innobase/include/srv0srv.h:
Small improvements
innobase/include/trx0trx.h:
Small improvements
innobase/buf/buf0lru.c:
Small improvements
innobase/fil/fil0fil.c:
Small improvements
innobase/log/log0recv.c:
Small improvements
innobase/mem/mem0mem.c:
Small improvements
innobase/mem/mem0pool.c:
Small improvements
innobase/row/row0mysql.c:
Small improvements + fix the ALTER TABLE problem by introducing a lazy drop table it can use
innobase/srv/srv0srv.c:
Small improvements
innobase/srv/srv0start.c:
Small improvements
innobase/trx/trx0purge.c:
Small improvements
innobase/trx/trx0trx.c:
Small improvements
Diffstat (limited to 'innobase/mem')
-rw-r--r-- | innobase/mem/mem0mem.c | 54 | ||||
-rw-r--r-- | innobase/mem/mem0pool.c | 36 |
2 files changed, 82 insertions, 8 deletions
diff --git a/innobase/mem/mem0mem.c b/innobase/mem/mem0mem.c index 3e0a9c008f3..0680968a7eb 100644 --- a/innobase/mem/mem0mem.c +++ b/innobase/mem/mem0mem.c @@ -75,6 +75,14 @@ After freeing, all the blocks in the heap are set to random bytes to help us discover errors which result from the use of buffers in an already freed heap. */ +#ifdef MEM_PERIODIC_CHECK + +ibool mem_block_list_inited; +/* List of all mem blocks allocated; protected by the mem_comm_pool mutex */ +UT_LIST_BASE_NODE_T(mem_block_t) mem_block_list; + +#endif + /******************************************************************* NOTE: Use the corresponding macro instead of this function. Allocates a single buffer of memory from the dynamic memory of @@ -169,7 +177,19 @@ mem_heap_create_block( 7); block->file_name[7]='\0'; block->line = line; + +#ifdef MEM_PERIODIC_CHECK + mem_pool_mutex_enter(); + + if (!mem_block_list_inited) { + mem_block_list_inited = TRUE; + UT_LIST_INIT(mem_block_list); + } + UT_LIST_ADD_LAST(mem_block_list, mem_block_list, block); + + mem_pool_mutex_exit(); +#endif mem_block_set_len(block, len); mem_block_set_type(block, type); mem_block_set_free(block, MEM_BLOCK_HEADER_SIZE); @@ -261,6 +281,13 @@ mem_heap_block_free( UT_LIST_REMOVE(list, heap->base, block); +#ifdef MEM_PERIODIC_CHECK + mem_pool_mutex_enter(); + + UT_LIST_REMOVE(mem_block_list, mem_block_list, block); + + mem_pool_mutex_exit(); +#endif type = heap->type; len = block->len; init_block = block->init_block; @@ -306,3 +333,30 @@ mem_heap_free_block_free( heap->free_block = NULL; } } + +#ifdef MEM_PERIODIC_CHECK +/********************************************************************** +Goes through the list of all allocated mem blocks, checks their magic +numbers, and reports possible corruption. */ + +void +mem_validate_all_blocks(void) +/*=========================*/ +{ + mem_block_t* block; + + mem_pool_mutex_enter(); + + block = UT_LIST_GET_FIRST(mem_block_list); + + while (block) { + if (block->magic_n != MEM_BLOCK_MAGIC_N) { + mem_analyze_corruption((byte*)block); + } + + block = UT_LIST_GET_NEXT(mem_block_list, block); + } + + mem_pool_mutex_exit(); +} +#endif diff --git a/innobase/mem/mem0pool.c b/innobase/mem/mem0pool.c index 48e7e686953..3681c8ef779 100644 --- a/innobase/mem/mem0pool.c +++ b/innobase/mem/mem0pool.c @@ -78,9 +78,9 @@ pool, and after that its locks will grow into the buffer pool. */ /* The smallest memory area total size */ #define MEM_AREA_MIN_SIZE (2 * MEM_AREA_EXTRA_SIZE) + /* Data structure for a memory pool. The space is allocated using the buddy algorithm, where free list i contains areas of size 2 to power i. */ - struct mem_pool_struct{ byte* buf; /* memory pool */ ulint size; /* memory common pool size */ @@ -99,6 +99,26 @@ mem_pool_t* mem_comm_pool = NULL; ulint mem_out_of_mem_err_msg_count = 0; /************************************************************************ +Reserves the mem pool mutex. */ + +void +mem_pool_mutex_enter(void) +/*======================*/ +{ + mutex_enter(&(mem_comm_pool->mutex)); +} + +/************************************************************************ +Releases the mem pool mutex. */ + +void +mem_pool_mutex_exit(void) +/*=====================*/ +{ + mutex_exit(&(mem_comm_pool->mutex)); +} + +/************************************************************************ Returns memory area size. */ UNIV_INLINE ulint @@ -240,15 +260,15 @@ mem_pool_fill_free_list( if (mem_out_of_mem_err_msg_count % 1000000000 == 0) { /* We do not print the message every time: */ + + ut_print_timestamp(stderr); fprintf(stderr, - "Innobase: Warning: out of memory in additional memory pool.\n"); - fprintf(stderr, - "Innobase: Innobase will start allocating memory from the OS.\n"); - fprintf(stderr, - "Innobase: You should restart the database with a bigger value in\n"); - fprintf(stderr, - "Innobase: the MySQL .cnf file for innobase_additional_mem_pool_size.\n"); + " InnoDB: Out of memory in additional memory pool.\n" + "InnoDB: InnoDB will start allocating memory from the OS.\n" + "InnoDB: You may get better performance if you configure a bigger\n" + "InnoDB: value in the MySQL my.cnf file for\n" + "InnoDB: innodb_additional_mem_pool_size.\n"); } mem_out_of_mem_err_msg_count++; |