diff options
Diffstat (limited to 'storage/innobase/mem/mem0pool.c')
-rw-r--r-- | storage/innobase/mem/mem0pool.c | 96 |
1 files changed, 49 insertions, 47 deletions
diff --git a/storage/innobase/mem/mem0pool.c b/storage/innobase/mem/mem0pool.c index cb891a03092..a61ab1ce170 100644 --- a/storage/innobase/mem/mem0pool.c +++ b/storage/innobase/mem/mem0pool.c @@ -157,8 +157,9 @@ mem_area_get_free( /* out: TRUE if free */ mem_area_t* area) /* in: area */ { - ut_ad(TRUE == MEM_AREA_FREE); - +#if TRUE != MEM_AREA_FREE +# error "TRUE != MEM_AREA_FREE" +#endif return(area->size_and_free & MEM_AREA_FREE); } @@ -171,8 +172,9 @@ mem_area_set_free( mem_area_t* area, /* in: area */ ibool free) /* in: free bit value */ { - ut_ad(TRUE == MEM_AREA_FREE); - +#if TRUE != MEM_AREA_FREE +# error "TRUE != MEM_AREA_FREE" +#endif area->size_and_free = (area->size_and_free & ~MEM_AREA_FREE) | free; } @@ -192,7 +194,7 @@ mem_pool_create( ulint used; ut_a(size > 10000); - + pool = ut_malloc(sizeof(mem_pool_t)); /* We do not set the memory to zero (FALSE) in the pool, @@ -221,7 +223,7 @@ mem_pool_create( if (ut_2_exp(i) > size - used) { /* ut_2_log rounds upward */ - + i--; } @@ -238,7 +240,7 @@ mem_pool_create( ut_ad(size >= used); pool->reserved = 0; - + return(pool); } @@ -264,17 +266,17 @@ mem_pool_fill_free_list( if (i >= 63) { /* We come here when we have run out of space in the memory pool: */ - + return(FALSE); } area = UT_LIST_GET_FIRST(pool->free_list[i + 1]); if (area == NULL) { - if (UT_LIST_GET_LEN(pool->free_list[i + 1]) > 0) { - ut_print_timestamp(stderr); + if (UT_LIST_GET_LEN(pool->free_list[i + 1]) > 0) { + ut_print_timestamp(stderr); - fprintf(stderr, + fprintf(stderr, " InnoDB: Error: mem pool free list %lu length is %lu\n" "InnoDB: though the list is empty!\n", (ulong) i + 1, @@ -292,7 +294,7 @@ mem_pool_fill_free_list( } if (UT_LIST_GET_LEN(pool->free_list[i + 1]) == 0) { - mem_analyze_corruption((byte*)area); + mem_analyze_corruption(area); ut_error; } @@ -305,14 +307,14 @@ mem_pool_fill_free_list( mem_area_set_free(area2, TRUE); UT_LIST_ADD_FIRST(free_list, pool->free_list[i], area2); - + mem_area_set_size(area, ut_2_exp(i)); UT_LIST_ADD_FIRST(free_list, pool->free_list[i], area); return(TRUE); } - + /************************************************************************ Allocates memory from a pool. NOTE: This low-level function should only be used in mem0mem.*! */ @@ -356,19 +358,19 @@ mem_area_alloc( } if (!mem_area_get_free(area)) { - fprintf(stderr, + fprintf(stderr, "InnoDB: Error: Removing element from mem pool free list %lu though the\n" "InnoDB: element is not marked free!\n", (ulong) n); - mem_analyze_corruption((byte*)area); + mem_analyze_corruption(area); /* Try to analyze a strange assertion failure reported at mysql@lists.mysql.com where the free bit IS 1 in the hex dump above */ if (mem_area_get_free(area)) { - fprintf(stderr, + fprintf(stderr, "InnoDB: Probably a race condition because now the area is marked free!\n"); } @@ -376,29 +378,29 @@ mem_area_alloc( } if (UT_LIST_GET_LEN(pool->free_list[n]) == 0) { - fprintf(stderr, + fprintf(stderr, "InnoDB: Error: Removing element from mem pool free list %lu\n" "InnoDB: though the list length is 0!\n", (ulong) n); - mem_analyze_corruption((byte*)area); + mem_analyze_corruption(area); ut_error; } - ut_ad(mem_area_get_size(area) == ut_2_exp(n)); + ut_ad(mem_area_get_size(area) == ut_2_exp(n)); mem_area_set_free(area, FALSE); - + UT_LIST_REMOVE(free_list, pool->free_list[n], area); pool->reserved += mem_area_get_size(area); - + mem_n_threads_inside--; mutex_exit(&(pool->mutex)); ut_ad(mem_pool_validate(pool)); - - return((void*)(MEM_AREA_EXTRA_SIZE + ((byte*)area))); + + return((void*)(MEM_AREA_EXTRA_SIZE + ((byte*)area))); } /************************************************************************ @@ -417,7 +419,7 @@ mem_area_get_buddy( ut_ad(size != 0); if (((((byte*)area) - pool->buf) % (2 * size)) == 0) { - + /* The buddy is in a higher address */ buddy = (mem_area_t*)(((byte*)area) + size); @@ -456,7 +458,7 @@ mem_area_free( void* new_ptr; ulint size; ulint n; - + /* It may be that the area was really allocated from the OS with regular malloc: check if ptr points within our memory pool */ @@ -468,27 +470,27 @@ mem_area_free( area = (mem_area_t*) (((byte*)ptr) - MEM_AREA_EXTRA_SIZE); - if (mem_area_get_free(area)) { - fprintf(stderr, + if (mem_area_get_free(area)) { + fprintf(stderr, "InnoDB: Error: Freeing element to mem pool free list though the\n" "InnoDB: element is marked free!\n"); - mem_analyze_corruption((byte*)area); + mem_analyze_corruption(area); ut_error; } size = mem_area_get_size(area); - - if (size == 0) { - fprintf(stderr, + + if (size == 0) { + fprintf(stderr, "InnoDB: Error: Mem area size is 0. Possibly a memory overrun of the\n" "InnoDB: previous allocated area!\n"); - mem_analyze_corruption((byte*)area); + mem_analyze_corruption(area); ut_error; } -#ifdef UNIV_LIGHT_MEM_DEBUG +#ifdef UNIV_LIGHT_MEM_DEBUG if (((byte*)area) + size < pool->buf + pool->size) { ulint next_size; @@ -496,20 +498,20 @@ mem_area_free( next_size = mem_area_get_size( (mem_area_t*)(((byte*)area) + size)); if (ut_2_power_up(next_size) != next_size) { - fprintf(stderr, + fprintf(stderr, "InnoDB: Error: Memory area size %lu, next area size %lu not a power of 2!\n" "InnoDB: Possibly a memory overrun of the buffer being freed here.\n", (ulong) size, (ulong) next_size); - mem_analyze_corruption((byte*)area); + mem_analyze_corruption(area); ut_error; } } #endif buddy = mem_area_get_buddy(area, size, pool); - + n = ut_2_log(size); - + mutex_enter(&(pool->mutex)); mem_n_threads_inside++; @@ -532,7 +534,7 @@ mem_area_free( } /* Remove the buddy from its free list and merge it to area */ - + UT_LIST_REMOVE(free_list, pool->free_list[n], buddy); pool->reserved += ut_2_exp(n); @@ -552,7 +554,7 @@ mem_area_free( pool->reserved -= size; } - + mem_n_threads_inside--; mutex_exit(&(pool->mutex)); @@ -576,9 +578,9 @@ mem_pool_validate( mutex_enter(&(pool->mutex)); free = 0; - + for (i = 0; i < 64; i++) { - + UT_LIST_VALIDATE(free_list, mem_area_t, pool->free_list[i]); area = UT_LIST_GET_FIRST(pool->free_list[i]); @@ -590,7 +592,7 @@ mem_pool_validate( buddy = mem_area_get_buddy(area, ut_2_exp(i), pool); ut_a(!buddy || !mem_area_get_free(buddy) - || (ut_2_exp(i) != mem_area_get_size(buddy))); + || (ut_2_exp(i) != mem_area_get_size(buddy))); area = UT_LIST_GET_NEXT(free_list, area); @@ -611,7 +613,7 @@ Prints info of a memory pool. */ void mem_pool_print_info( /*================*/ - FILE* outfile,/* in: output file to write to */ + FILE* outfile,/* in: output file to write to */ mem_pool_t* pool) /* in: memory pool */ { ulint i; @@ -629,11 +631,11 @@ mem_pool_print_info( "Free list length %lu for blocks of size %lu\n", (ulong) UT_LIST_GET_LEN(pool->free_list[i]), (ulong) ut_2_exp(i)); - } + } } fprintf(outfile, "Pool size %lu, reserved %lu.\n", (ulong) pool->size, - (ulong) pool->reserved); + (ulong) pool->reserved); mutex_exit(&(pool->mutex)); } @@ -651,7 +653,7 @@ mem_pool_get_reserved( mutex_enter(&(pool->mutex)); reserved = pool->reserved; - + mutex_exit(&(pool->mutex)); return(reserved); |