📄 buf0buf.ic
字号:
/******************************************************The database buffer buf_pool(c) 1995 Innobase OyCreated 11/5/1995 Heikki Tuuri*******************************************************/#include "buf0flu.h"#include "buf0lru.h"#include "buf0rea.h"#include "mtr0mtr.h"#ifdef UNIV_DEBUGextern ulint buf_dbg_counter; /* This is used to insert validation operations in execution in the debug version */#endif /* UNIV_DEBUG *//************************************************************************Recommends a move of a block to the start of the LRU list if there is dangerof dropping from the buffer pool. NOTE: does not reserve the buffer poolmutex. */UNIV_INLINEiboolbuf_block_peek_if_too_old(/*======================*/ /* out: TRUE if should be made younger */ buf_block_t* block) /* in: block to make younger */{ return(buf_pool->freed_page_clock >= block->freed_page_clock + 1 + (buf_pool->curr_size / 1024));}/*************************************************************************Gets the current size of buffer buf_pool in bytes. In the case of AWE, thesize of AWE window (= the frames). */UNIV_INLINEulintbuf_pool_get_curr_size(void)/*========================*/ /* out: size in bytes */{ return((buf_pool->n_frames) * UNIV_PAGE_SIZE);} /*************************************************************************Gets the maximum size of buffer buf_pool in bytes. In the case of AWE, thesize of AWE window (= the frames). */UNIV_INLINEulintbuf_pool_get_max_size(void)/*=======================*/ /* out: size in bytes */{ return((buf_pool->n_frames) * UNIV_PAGE_SIZE);} /***********************************************************************Accessor function for block array. */UNIV_INLINEbuf_block_t*buf_pool_get_nth_block(/*===================*/ /* out: pointer to block */ buf_pool_t* buf_pool,/* in: buf_pool */ ulint i) /* in: index of the block */{ ut_ad(buf_pool); ut_ad(i < buf_pool->max_size); return(i + buf_pool->blocks);} /***********************************************************************Checks if a pointer points to the block array of the buffer pool (blocks, notthe frames). */UNIV_INLINEiboolbuf_pool_is_block(/*==============*/ /* out: TRUE if pointer to block */ void* ptr) /* in: pointer to memory */{ if ((buf_pool->blocks <= (buf_block_t*)ptr) && ((buf_block_t*)ptr < buf_pool->blocks + buf_pool->max_size)) { return(TRUE); } return(FALSE);} /************************************************************************Gets the smallest oldest_modification lsn for any page in the pool. Returnsut_dulint_zero if all modified pages have been flushed to disk. */UNIV_INLINEdulintbuf_pool_get_oldest_modification(void)/*==================================*/ /* out: oldest modification in pool, ut_dulint_zero if none */{ buf_block_t* block; dulint lsn; mutex_enter(&(buf_pool->mutex)); block = UT_LIST_GET_LAST(buf_pool->flush_list); if (block == NULL) { lsn = ut_dulint_zero; } else { lsn = block->oldest_modification; } mutex_exit(&(buf_pool->mutex)); return(lsn);}/***********************************************************************Increments the buf_pool clock by one and returns its new value. Rememberthat in the 32 bit version the clock wraps around at 4 billion! */UNIV_INLINEulintbuf_pool_clock_tic(void)/*====================*/ /* out: new clock value */{#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex)));#endif /* UNIV_SYNC_DEBUG */ buf_pool->ulint_clock++; return(buf_pool->ulint_clock);}/*************************************************************************Gets a pointer to the memory frame of a block. */UNIV_INLINEbuf_frame_t*buf_block_get_frame(/*================*/ /* out: pointer to the frame */ buf_block_t* block) /* in: pointer to the control block */{ ut_ad(block); ut_ad(block >= buf_pool->blocks); ut_ad(block < buf_pool->blocks + buf_pool->max_size); ut_ad(block->state != BUF_BLOCK_NOT_USED); ut_ad((block->state != BUF_BLOCK_FILE_PAGE) || (block->buf_fix_count > 0)); return(block->frame);} /*************************************************************************Gets the space id of a block. */UNIV_INLINEulintbuf_block_get_space(/*================*/ /* out: space id */ buf_block_t* block) /* in: pointer to the control block */{ ut_ad(block); ut_ad(block >= buf_pool->blocks); ut_ad(block < buf_pool->blocks + buf_pool->max_size); ut_a(block->state == BUF_BLOCK_FILE_PAGE); ut_ad(block->buf_fix_count > 0); return(block->space);} /*************************************************************************Gets the page number of a block. */UNIV_INLINEulintbuf_block_get_page_no(/*==================*/ /* out: page number */ buf_block_t* block) /* in: pointer to the control block */{ ut_ad(block); ut_ad(block >= buf_pool->blocks); ut_ad(block < buf_pool->blocks + buf_pool->max_size); ut_a(block->state == BUF_BLOCK_FILE_PAGE); ut_ad(block->buf_fix_count > 0); return(block->offset);} /***********************************************************************Gets the block to whose frame the pointer is pointing to. */UNIV_INLINEbuf_block_t*buf_block_align(/*============*/ /* out: pointer to block */ byte* ptr) /* in: pointer to a frame */{ buf_block_t* block; buf_frame_t* frame_zero; ut_ad(ptr); frame_zero = buf_pool->frame_zero; if (UNIV_UNLIKELY((ulint)ptr < (ulint)frame_zero) || UNIV_UNLIKELY((ulint)ptr > (ulint)(buf_pool->high_end))) { ut_print_timestamp(stderr); fprintf(stderr,"InnoDB: Error: trying to access a stray pointer %p\n""InnoDB: buf pool start is at %p, end at %p\n""InnoDB: Probable reason is database corruption or memory\n""InnoDB: corruption. If this happens in an InnoDB database recovery,\n""InnoDB: you can look from section 6.1 at http://www.innodb.com/ibman.html\n""InnoDB: how to force recovery.\n", ptr, frame_zero, buf_pool->high_end); ut_error; } block = *(buf_pool->blocks_of_frames + (((ulint)(ptr - frame_zero)) >> UNIV_PAGE_SIZE_SHIFT)); return(block);} /***********************************************************************Gets the frame the pointer is pointing to. */UNIV_INLINEbuf_frame_t*buf_frame_align(/*============*/ /* out: pointer to frame */ byte* ptr) /* in: pointer to a frame */{ buf_frame_t* frame; ut_ad(ptr); frame = ut_align_down(ptr, UNIV_PAGE_SIZE); if (UNIV_UNLIKELY((ulint)frame < (ulint)(buf_pool->frame_zero)) || UNIV_UNLIKELY((ulint)frame >= (ulint)(buf_pool->high_end))) { ut_print_timestamp(stderr); fprintf(stderr,"InnoDB: Error: trying to access a stray pointer %p\n""InnoDB: buf pool start is at %p, end at %p\n""InnoDB: Probable reason is database corruption or memory\n""InnoDB: corruption. If this happens in an InnoDB database recovery,\n""InnoDB: you can look from section 6.1 at http://www.innodb.com/ibman.html\n""InnoDB: how to force recovery.\n", ptr, buf_pool->frame_zero, buf_pool->high_end); ut_error; } return(frame);}/**************************************************************************Gets the page number of a pointer pointing within a buffer frame containinga file page. */UNIV_INLINEulintbuf_frame_get_page_no(/*==================*/ /* out: page number */ byte* ptr) /* in: pointer to within a buffer frame */{ return(buf_block_get_page_no(buf_block_align(ptr)));}/**************************************************************************Gets the space id of a pointer pointing within a buffer frame containing afile page. */UNIV_INLINEulintbuf_frame_get_space_id(/*===================*/ /* out: space id */ byte* ptr) /* in: pointer to within a buffer frame */{ return(buf_block_get_space(buf_block_align(ptr)));}/**************************************************************************Gets the space id, page offset, and byte offset within page of apointer pointing to a buffer frame containing a file page. */UNIV_INLINEvoidbuf_ptr_get_fsp_addr(/*=================*/ byte* ptr, /* in: pointer to a buffer frame */ ulint* space, /* out: space id */ fil_addr_t* addr) /* out: page offset and byte offset */{ buf_block_t* block; block = buf_block_align(ptr); *space = buf_block_get_space(block); addr->page = buf_block_get_page_no(block); addr->boffset = ptr - buf_frame_align(ptr);}/**************************************************************************Gets the hash value of the page the pointer is pointing to. This can be usedin searches in the lock hash table. */UNIV_INLINEulintbuf_frame_get_lock_hash_val(/*========================*/ /* out: lock hash value */ byte* ptr) /* in: pointer to within a buffer frame */{ buf_block_t* block; block = buf_block_align(ptr); return(block->lock_hash_val);}/**************************************************************************Gets the mutex number protecting the page record lock hash chain in the locktable. */UNIV_INLINEmutex_t*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -