94 #ifdef MEM_PERIODIC_CHECK
96 ibool mem_block_list_inited;
112 return(static_cast<char *>(
mem_heap_dup(heap, str, strlen(str) + 1)));
141 ulint s1_len = strlen(s1);
142 ulint s2_len = strlen(s2);
144 s =
static_cast<char *
>(
mem_heap_alloc(heap, s1_len + s2_len + 1));
146 memcpy(s, s1, s1_len);
147 memcpy(s + s1_len, s2, s2_len);
149 s[s1_len + s2_len] =
'\0';
172 ibool is_long = FALSE;
177 if (*format++ !=
'%') {
183 *buf++ = *(format - 1);
189 if (*format ==
'l') {
198 char* s = va_arg(ap,
char*);
207 memcpy(buf, s, plen);
223 val = va_arg(ap,
unsigned long);
225 plen = sprintf(tmp,
"%lu", val);
229 memcpy(buf, tmp, plen);
284 va_start(ap, format);
285 len = mem_heap_printf_low(NULL, format, ap);
290 va_start(ap, format);
291 mem_heap_printf_low(str, format, ap);
303 mem_heap_create_block(
310 const char* file_name,
313 #ifndef UNIV_HOTBACKUP
319 ut_ad((type == MEM_HEAP_DYNAMIC) || (type == MEM_HEAP_BUFFER)
320 || (type == MEM_HEAP_BUFFER + MEM_HEAP_BTR_SEARCH));
322 if (heap && heap->magic_n != MEM_BLOCK_MAGIC_N) {
327 len = MEM_BLOCK_HEADER_SIZE + MEM_SPACE_NEEDED(n);
329 #ifndef UNIV_HOTBACKUP
330 if (type == MEM_HEAP_DYNAMIC || len < UNIV_PAGE_SIZE / 2) {
332 ut_ad(type == MEM_HEAP_DYNAMIC || n <= MEM_MAX_ALLOC_IN_BUF);
336 len = UNIV_PAGE_SIZE;
338 if ((type & MEM_HEAP_BTR_SEARCH) && heap) {
343 buf_block =
static_cast<buf_block_t *
>(heap->free_block);
344 heap->free_block = NULL;
346 if (UNIV_UNLIKELY(!buf_block)) {
351 buf_block = buf_block_alloc(NULL, 0);
358 block->buf_block = buf_block;
359 block->free_block = NULL;
361 len = MEM_BLOCK_HEADER_SIZE + MEM_SPACE_NEEDED(n);
366 block->magic_n = MEM_BLOCK_MAGIC_N;
367 ut_strlcpy_rev(block->file_name, file_name,
sizeof(block->file_name));
370 #ifdef MEM_PERIODIC_CHECK
373 if (!mem_block_list_inited) {
374 mem_block_list_inited = TRUE;
382 mem_block_set_len(block, len);
383 mem_block_set_type(block, type);
384 mem_block_set_free(block, MEM_BLOCK_HEADER_SIZE);
385 mem_block_set_start(block, MEM_BLOCK_HEADER_SIZE);
387 if (UNIV_UNLIKELY(heap == NULL)) {
401 ut_ad((ulint)MEM_BLOCK_HEADER_SIZE < len);
421 ut_ad(mem_heap_check(heap));
429 new_size = 2 * mem_block_get_len(block);
431 if (heap->
type != MEM_HEAP_DYNAMIC) {
433 ut_a(n <= MEM_MAX_ALLOC_IN_BUF);
435 if (new_size > MEM_MAX_ALLOC_IN_BUF) {
436 new_size = MEM_MAX_ALLOC_IN_BUF;
438 }
else if (new_size > MEM_BLOCK_STANDARD_SIZE) {
440 new_size = MEM_BLOCK_STANDARD_SIZE;
447 new_block = mem_heap_create_block(heap, new_size, heap->
type,
448 heap->file_name, heap->
line);
449 if (new_block == NULL) {
472 #ifndef UNIV_HOTBACKUP
476 if (block->magic_n != MEM_BLOCK_MAGIC_N) {
482 #ifdef MEM_PERIODIC_CHECK
495 block->magic_n = MEM_FREED_BLOCK_MAGIC_N;
497 #ifndef UNIV_HOTBACKUP
498 #ifdef UNIV_MEM_DEBUG
502 mem_erase_buf((byte*)block, len);
504 UNIV_MEM_ASSERT_AND_FREE(block, len);
507 if (type == MEM_HEAP_DYNAMIC || len < UNIV_PAGE_SIZE / 2) {
512 ut_ad(type & MEM_HEAP_BUFFER);
517 #ifdef UNIV_MEM_DEBUG
521 mem_erase_buf((byte*)block, len);
523 UNIV_MEM_ASSERT_AND_FREE(block, len);
529 #ifndef UNIV_HOTBACKUP
534 mem_heap_free_block_free(
538 if (UNIV_LIKELY_NULL(heap->free_block)) {
542 heap->free_block = NULL;
547 #ifdef MEM_PERIODIC_CHECK
553 mem_validate_all_blocks(
void)
563 if (block->magic_n != MEM_BLOCK_MAGIC_N) {