diff options
Diffstat (limited to 'innobase')
-rw-r--r-- | innobase/include/Makefile.am | 2 | ||||
-rw-r--r-- | innobase/include/Makefile.i | 2 | ||||
-rw-r--r-- | innobase/include/mem0mem.ic | 12 | ||||
-rw-r--r-- | innobase/include/os0sync.h | 2 | ||||
-rw-r--r-- | innobase/include/os0sync.ic | 2 | ||||
-rw-r--r-- | innobase/include/srv0srv.h | 1 | ||||
-rw-r--r-- | innobase/include/univ.i | 8 | ||||
-rw-r--r-- | innobase/include/ut0mem.h | 33 | ||||
-rw-r--r-- | innobase/include/ut0mem.ic | 7 | ||||
-rw-r--r-- | innobase/log/log0log.c | 15 | ||||
-rw-r--r-- | innobase/mem/mem0pool.c | 6 | ||||
-rw-r--r-- | innobase/os/os0sync.c | 2 | ||||
-rw-r--r-- | innobase/srv/srv0srv.c | 6 | ||||
-rw-r--r-- | innobase/srv/srv0start.c | 10 | ||||
-rw-r--r-- | innobase/ut/ut0mem.c | 132 |
15 files changed, 199 insertions, 41 deletions
diff --git a/innobase/include/Makefile.am b/innobase/include/Makefile.am index fd5cc8b1a80..8664f6dfc17 100644 --- a/innobase/include/Makefile.am +++ b/innobase/include/Makefile.am @@ -55,5 +55,7 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \ ut0dbg.h ut0lst.h ut0mem.h ut0mem.ic ut0rnd.h ut0rnd.ic \ ut0sort.h ut0ut.h ut0ut.ic +EXTRA_DIST = Makefile.i + # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/innobase/include/Makefile.i b/innobase/include/Makefile.i index 8c7e9910f26..985ec525950 100644 --- a/innobase/include/Makefile.i +++ b/innobase/include/Makefile.i @@ -2,7 +2,7 @@ libsdir = ../libs -INCLUDES = -I../../include -I../include +INCLUDES = -I$(srcdir)/../include -I$(srcdir)/../../include -I../../include # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/innobase/include/mem0mem.ic b/innobase/include/mem0mem.ic index 8b8449469ef..edc3ab17f2a 100644 --- a/innobase/include/mem0mem.ic +++ b/innobase/include/mem0mem.ic @@ -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; + + buf = mem_area_alloc(n, mem_comm_pool); - return(mem_area_alloc(n, mem_comm_pool)); +#ifdef UNIV_SET_MEM_TO_ZERO + memset(buf, '\0', n); +#endif + return(buf); #else diff --git a/innobase/include/os0sync.h b/innobase/include/os0sync.h index 89e3f953b50..78374cf8ede 100644 --- a/innobase/include/os0sync.h +++ b/innobase/include/os0sync.h @@ -160,6 +160,7 @@ os_fast_mutex_trylock( was reserved by another thread */ os_fast_mutex_t* fast_mutex); /* in: mutex to acquire */ +#endif /************************************************************** Releases ownership of a fast mutex. */ UNIV_INLINE @@ -188,7 +189,6 @@ void os_fast_mutex_free( /*===============*/ os_fast_mutex_t* fast_mutex); /* in: mutex to free */ -#endif #ifndef UNIV_NONINL #include "os0sync.ic" diff --git a/innobase/include/os0sync.ic b/innobase/include/os0sync.ic index 8be9a783593..057ad424dee 100644 --- a/innobase/include/os0sync.ic +++ b/innobase/include/os0sync.ic @@ -38,6 +38,7 @@ os_fast_mutex_trylock( return((ulint) pthread_mutex_trylock(fast_mutex)); #endif } +#endif /************************************************************** Releases ownership of a fast mutex. */ @@ -53,4 +54,3 @@ os_fast_mutex_unlock( pthread_mutex_unlock(fast_mutex); #endif } -#endif diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 3f014adb76c..b77d7d5436a 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -70,6 +70,7 @@ extern ulint srv_n_rows_read; extern ibool srv_print_innodb_monitor; extern ibool srv_print_innodb_lock_monitor; extern ibool srv_print_innodb_tablespace_monitor; +extern ibool srv_print_verbose_log; extern ulint srv_n_spin_wait_rounds; extern ulint srv_spin_wait_delay; diff --git a/innobase/include/univ.i b/innobase/include/univ.i index d36b4ca9b8b..c56f21d6617 100644 --- a/innobase/include/univ.i +++ b/innobase/include/univ.i @@ -61,8 +61,12 @@ subdirectory of 'mysql'. */ /* DEBUG VERSION CONTROL ===================== */ +/* The following flag will make InnoDB to initialize +all memory it allocates to zero. It hides Purify +warnings about reading unallocated memory unless +memory is read outside the allocated blocks. */ /* -#define UNIV_SYNC_DEBUG +#define UNIV_INIT_MEM_TO_ZERO */ /* Make a non-inline debug version */ @@ -72,7 +76,7 @@ subdirectory of 'mysql'. */ #define UNIV_SEARCH_DEBUG #define UNIV_IBUF_DEBUG - +#define UNIV_SYNC_DEBUG #define UNIV_SYNC_PERF_STAT #define UNIV_SEARCH_PERF_STAT */ diff --git a/innobase/include/ut0mem.h b/innobase/include/ut0mem.h index fa46514fe16..8e5a4fda0d3 100644 --- a/innobase/include/ut0mem.h +++ b/innobase/include/ut0mem.h @@ -26,12 +26,39 @@ int ut_memcmp(void* str1, void* str2, 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(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 */ +/************************************************************************** +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. */ + +void +ut_free( +/*====*/ + void* ptr); /* in, own: memory block */ +/************************************************************************** +Frees all allocated memory not freed yet. */ -UNIV_INLINE void -ut_free(void* ptr); +ut_free_all_mem(void); +/*=================*/ UNIV_INLINE char* diff --git a/innobase/include/ut0mem.ic b/innobase/include/ut0mem.ic index fc4b6bd8be5..7ae9bc8bd74 100644 --- a/innobase/include/ut0mem.ic +++ b/innobase/include/ut0mem.ic @@ -28,13 +28,6 @@ ut_memcmp(void* str1, void* str2, ulint n) } UNIV_INLINE -void -ut_free(void* ptr) -{ - free(ptr); -} - -UNIV_INLINE char* ut_strcpy(char* dest, char* sour) { diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index beac63535ab..ec42c8f2e08 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -2641,9 +2641,11 @@ logs_empty_and_mark_files_at_shutdown(void) dulint lsn; ulint arch_log_no; - ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: Starting shutdown...\n"); - + if (srv_print_verbose_log) + { + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Starting shutdown...\n"); + } /* Wait until the master thread and all other operations are idle: our algorithm only works if the server is idle at shutdown */ loop: @@ -2732,8 +2734,11 @@ loop: fil_flush_file_spaces(FIL_TABLESPACE); - ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: Shutdown completed\n"); + if (srv_print_verbose_log) + { + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Shutdown completed\n"); + } } /********************************************************** diff --git a/innobase/mem/mem0pool.c b/innobase/mem/mem0pool.c index e8c02d812c4..6c3a4adebae 100644 --- a/innobase/mem/mem0pool.c +++ b/innobase/mem/mem0pool.c @@ -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)); diff --git a/innobase/os/os0sync.c b/innobase/os/os0sync.c index c5dd603100d..8da142cd4a6 100644 --- a/innobase/os/os0sync.c +++ b/innobase/os/os0sync.c @@ -422,7 +422,6 @@ os_mutex_free( #endif } -#ifndef _WIN32 /************************************************************* Initializes an operating system fast mutex semaphore. */ @@ -472,4 +471,3 @@ os_fast_mutex_free( #endif } -#endif diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index ba556e1c050..1237a788622 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -120,6 +120,12 @@ ibool srv_print_innodb_monitor = FALSE; ibool srv_print_innodb_lock_monitor = FALSE; ibool srv_print_innodb_tablespace_monitor = FALSE; +/* + Set the following to 0 if you want InnoDB to write messages on + stderr on startup/shutdown +*/ +ibool srv_print_verbose_log = TRUE; + /* The parameters below are obsolete: */ ibool srv_print_parsed_sql = FALSE; diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index c4002767226..2e9bade8b35 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -888,9 +888,11 @@ innobase_start_or_create_for_mysql(void) /* buf_debug_prints = TRUE; */ - ut_print_timestamp(stderr); - fprintf(stderr, " InnoDB: Started\n"); - + if (srv_print_verbose_log) + { + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Started\n"); + } return((int) DB_SUCCESS); } @@ -916,5 +918,7 @@ innobase_shutdown_for_mysql(void) logs_empty_and_mark_files_at_shutdown(); + ut_free_all_mem(); + return((int) DB_SUCCESS); } diff --git a/innobase/ut/ut0mem.c b/innobase/ut/ut0mem.c index 492f57670a9..ebeefe0c297 100644 --- a/innobase/ut/ut0mem.c +++ b/innobase/ut/ut0mem.c @@ -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); } /************************************************************************** |