29 # include "buf0buddy.ic"
52 if (((ulint) page) & size) {
63 buf_buddy_add_to_free(
70 #ifdef UNIV_DEBUG_VALGRIND
78 ut_ad(buf_pool->zip_free[i].start != bpage);
81 #ifdef UNIV_DEBUG_VALGRIND
91 buf_buddy_remove_from_free(
98 #ifdef UNIV_DEBUG_VALGRIND
113 #ifdef UNIV_DEBUG_VALGRIND
134 #ifndef UNIV_DEBUG_VALGRIND
146 buf_buddy_remove_from_free(buf_pool, bpage, i);
149 bpage = (
buf_page_t *)buf_buddy_alloc_zip(buf_pool, i + 1);
155 ut_ad(!buf_pool_contains_zip(buf_pool, buddy));
158 buf_buddy_add_to_free(buf_pool, buddy, i);
177 buf_buddy_block_free(
192 && bpage->in_zip_hash && !bpage->in_page_hash),
196 ut_ad(!bpage->in_page_hash);
197 ut_ad(bpage->in_zip_hash);
198 ut_d(bpage->in_zip_hash = FALSE);
201 ut_d(memset(buf, 0, UNIV_PAGE_SIZE));
202 UNIV_MEM_INVALID(buf, UNIV_PAGE_SIZE);
205 mutex_enter(&block->
mutex);
207 mutex_exit(&block->
mutex);
209 ut_ad(buf_pool->buddy_n_frames > 0);
210 ut_d(buf_pool->buddy_n_frames--);
217 buf_buddy_block_register(
222 const ulint fold = BUF_POOL_ZIP_FOLD(block);
234 ut_d(block->
page.in_zip_hash = TRUE);
237 ut_d(buf_pool->buddy_n_frames++);
245 buf_buddy_alloc_from(
269 #ifndef UNIV_DEBUG_VALGRIND
276 buf_buddy_add_to_free(buf_pool, bpage, j);
308 block = (
buf_block_t *)buf_buddy_alloc_zip(buf_pool, i);
335 buf_buddy_block_register(block);
350 buf_buddy_relocate_block(
396 UNIV_MEM_INVALID(bpage,
sizeof *bpage);
425 UNIV_MEM_ASSERT_W(dst, size);
457 UNIV_MEM_VALID(&space,
sizeof space);
458 UNIV_MEM_VALID(&page_no,
sizeof page_no);
461 if (!bpage || bpage->
zip.
data != src) {
483 UNIV_MEM_ASSERT_W(src, size);
492 memcpy(dst, src, size);
496 UNIV_MEM_INVALID(src, size);
508 }
else if (i == buf_buddy_get_slot(
sizeof(
buf_page_t))) {
510 #if UNIV_WORD_SIZE == 4
514 UNIV_MEM_ASSERT_RW(src, size);
551 buf_buddy_block_free(buf_pool, buf);
557 ut_ad(!buf_pool_contains_zip(buf_pool, buf));
563 #ifndef UNIV_DEBUG_VALGRIND
580 if (bpage == buddy) {
583 buf_buddy_remove_from_free(buf_pool, bpage, i);
586 ut_ad(!buf_pool_contains_zip(buf_pool, buddy));
602 #ifndef UNIV_DEBUG_VALGRIND
618 buf_buddy_remove_from_free(buf_pool, bpage, i);
621 if (buf_buddy_relocate(buf_pool, buddy, bpage, i)) {
627 buf_buddy_add_to_free(buf_pool, bpage, i);
630 buddy = (
buf_page_t*) buf_buddy_get(((byte*) bpage),
633 #ifndef UNIV_DEBUG_VALGRIND
645 && ut_list_node_313 != buddy)));
648 if (buf_buddy_relocate(buf_pool, buddy, buf, i)) {
671 # ifndef UNIV_DEBUG_VALGRIND
679 for (; b < b_end; b++) {
687 "buddy dirty %p %u (%u,%u) %p,%lu\n",
702 c-- > (
char*) buf; ) {
711 buf_buddy_add_to_free(buf_pool, bpage, i);
#define buf_pool_mutex_enter(b)
#define UT_LIST_GET_NEXT(NAME, N)
ib_uint64_t relocated_usec
#define UT_LIST_VALIDATE(NAME, TYPE, BASE, ASSERTION)
UNIV_INLINE void buf_block_set_state(buf_block_t *block, enum buf_page_state state)
buf_buddy_stat_t buddy_stat[BUF_BUDDY_SIZES_MAX+1]
UNIV_INTERN void buf_LRU_block_free_non_file_page(buf_block_t *block)
UNIV_INLINE ulint ut_align_offset(const void *ptr, ulint align_no) __attribute__((const ))
UNIV_INTERN void buf_relocate(buf_page_t *bpage, buf_page_t *dpage) __attribute__((nonnull))
UNIV_INTERN ullint ut_time_us(ullint *tloc)
#define HASH_INSERT(TYPE, NAME, TABLE, FOLD, DATA)
#define PAGE_ZIP_MIN_SIZE
The buffer pool structure.
#define UT_LIST_REMOVE(NAME, BASE, N)
UNIV_INLINE ibool buf_page_can_relocate(const buf_page_t *bpage) __attribute__((pure))
UNIV_INLINE enum buf_page_state buf_block_get_state(const buf_block_t *block) __attribute__((pure))
UNIV_INLINE enum buf_page_state buf_page_get_state(const buf_page_t *bpage)
UNIV_INLINE void * ut_align_down(const void *ptr, ulint align_no) __attribute__((const ))
#define UT_LIST_GET_PREV(NAME, N)
#define UT_LIST_INSERT_AFTER(NAME, BASE, NODE1, NODE2)
UNIV_INLINE buf_page_t * buf_page_hash_get(buf_pool_t *buf_pool, ulint space, ulint offset)
#define UT_LIST_GET_FIRST(BASE)
#define BUF_POOL_ZIP_FOLD_PTR(ptr)
UNIV_INLINE buf_pool_t * buf_pool_from_bpage(const buf_page_t *bpage)
#define HASH_SEARCH(NAME, TABLE, FOLD, TYPE, DATA, ASSERTION, TEST)
#define UT_LIST_ADD_FIRST(NAME, BASE, N)
UNIV_INLINE ulint mach_read_from_4(const byte *b) __attribute__((nonnull
UNIV_INTERN buf_block_t * buf_LRU_get_free_only(buf_pool_t *buf_pool)
UNIV_INLINE buf_pool_t * buf_pool_from_block(const buf_block_t *block)
UNIV_INLINE mutex_t * buf_page_get_mutex(const buf_page_t *bpage) __attribute__((pure))
#define HASH_DELETE(TYPE, NAME, TABLE, FOLD, DATA)
#define buf_pool_mutex_own(b)
#define FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID
#define buf_pool_mutex_exit(b)
UNIV_INLINE ulint page_zip_get_size(const page_zip_des_t *page_zip) __attribute__((nonnull
UNIV_INTERN buf_block_t * buf_LRU_get_free_block(buf_pool_t *buf_pool) __attribute__((nonnull
UNIV_INTERN ibool buf_pool_watch_is_sentinel(buf_pool_t *buf_pool, const buf_page_t *bpage) UNIV_WARN_UNUSED_RESULT