📄 buf0buf.ic
字号:
buf_frame_get_lock_mutex(/*=====================*/ /* out: mutex */ byte* ptr) /* in: pointer to within a buffer frame */{ buf_block_t* block; block = buf_block_align(ptr); return(block->lock_mutex);}/*************************************************************************Copies contents of a buffer frame to a given buffer. */UNIV_INLINEbyte*buf_frame_copy(/*===========*/ /* out: buf */ byte* buf, /* in: buffer to copy to */ buf_frame_t* frame) /* in: buffer frame */{ ut_ad(buf && frame); ut_memcpy(buf, frame, UNIV_PAGE_SIZE); return(buf);}/************************************************************************Calculates a folded value of a file page address to use in the page hashtable. */UNIV_INLINEulintbuf_page_address_fold(/*==================*/ /* out: the folded value */ ulint space, /* in: space id */ ulint offset) /* in: offset of the page within space */{ return((space << 20) + space + offset);} /************************************************************************This function is used to get info if there is an io operationgoing on on a buffer page. */UNIV_INLINEiboolbuf_page_io_query(/*==============*/ /* out: TRUE if io going on */ buf_block_t* block) /* in: buf_pool block, must be bufferfixed */{ mutex_enter(&(buf_pool->mutex)); ut_ad(block->state == BUF_BLOCK_FILE_PAGE); ut_ad(block->buf_fix_count > 0); if (block->io_fix != 0) { mutex_exit(&(buf_pool->mutex)); return(TRUE); } mutex_exit(&(buf_pool->mutex)); return(FALSE);}/************************************************************************Gets the youngest modification log sequence number for a frame. Returns zeroif not a file page or no modification occurred yet. */UNIV_INLINEdulintbuf_frame_get_newest_modification(/*==============================*/ /* out: newest modification to the page */ buf_frame_t* frame) /* in: pointer to a frame */{ buf_block_t* block; dulint lsn; ut_ad(frame); block = buf_block_align(frame); mutex_enter(&(buf_pool->mutex)); if (block->state == BUF_BLOCK_FILE_PAGE) { lsn = block->newest_modification; } else { lsn = ut_dulint_zero; } mutex_exit(&(buf_pool->mutex)); return(lsn);}/************************************************************************Increments the modify clock of a frame by 1. The caller must (1) own thebuf_pool mutex and block bufferfix count has to be zero, (2) or own an x-lockon the block. */UNIV_INLINEdulintbuf_frame_modify_clock_inc(/*=======================*/ /* out: new value */ buf_frame_t* frame) /* in: pointer to a frame */{ buf_block_t* block; ut_ad(frame); block = buf_block_align(frame);#ifdef UNIV_SYNC_DEBUG ut_ad((mutex_own(&(buf_pool->mutex)) && (block->buf_fix_count == 0)) || rw_lock_own(&(block->lock), RW_LOCK_EXCLUSIVE));#endif /*UNIV_SYNC_DEBUG */ UT_DULINT_INC(block->modify_clock); return(block->modify_clock);}/************************************************************************Increments the modify clock of a frame by 1. The caller must (1) own thebuf_pool mutex and block bufferfix count has to be zero, (2) or own an x-lockon the block. */UNIV_INLINEdulintbuf_block_modify_clock_inc(/*=======================*/ /* out: new value */ buf_block_t* block) /* in: block */{#ifdef UNIV_SYNC_DEBUG ut_ad((mutex_own(&(buf_pool->mutex)) && (block->buf_fix_count == 0)) || rw_lock_own(&(block->lock), RW_LOCK_EXCLUSIVE));#endif /* UNIV_SYNC_DEBUG */ UT_DULINT_INC(block->modify_clock); return(block->modify_clock);}/************************************************************************Returns the value of the modify clock. The caller must have an s-lock or x-lock on the block. */UNIV_INLINEdulintbuf_block_get_modify_clock(/*=======================*/ /* out: value */ buf_block_t* block) /* in: block */{#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(block->lock), RW_LOCK_SHARED) || rw_lock_own(&(block->lock), RW_LOCK_EXCLUSIVE));#endif /* UNIV_SYNC_DEBUG */ return(block->modify_clock);}#ifdef UNIV_SYNC_DEBUG/***********************************************************************Increments the bufferfix count. */UNIV_INLINEvoidbuf_block_buf_fix_inc_debug(/*========================*/ buf_block_t* block, /* in: block to bufferfix */ const char* file __attribute__ ((unused)), /* in: file name */ ulint line __attribute__ ((unused))) /* in: line */{#ifdef UNIV_SYNC_DEBUG ibool ret; ret = rw_lock_s_lock_func_nowait(&(block->debug_latch), file, line); ut_ad(ret == TRUE);#endif block->buf_fix_count++;}#else /* UNIV_SYNC_DEBUG *//***********************************************************************Increments the bufferfix count. */UNIV_INLINEvoidbuf_block_buf_fix_inc(/*==================*/ buf_block_t* block) /* in: block to bufferfix */{ block->buf_fix_count++;}#endif /* UNIV_SYNC_DEBUG *//**********************************************************************Returns the control block of a file page, NULL if not found. */UNIV_INLINEbuf_block_t*buf_page_hash_get(/*==============*/ /* out: block, NULL if not found */ ulint space, /* in: space id */ ulint offset) /* in: offset of the page within space */{ buf_block_t* block; ulint fold; ut_ad(buf_pool);#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(buf_pool->mutex)));#endif /* UNIV_SYNC_DEBUG */ /* Look for the page in the hash table */ fold = buf_page_address_fold(space, offset); HASH_SEARCH(hash, buf_pool->page_hash, fold, block, (block->space == space) && (block->offset == offset)); ut_a(block == NULL || block->state == BUF_BLOCK_FILE_PAGE); return(block);}/************************************************************************Tries to get the page, but if file io is required, releases all latchesin mtr down to the given savepoint. If io is required, this functionretrieves the page to buffer buf_pool, but does not bufferfix it or latchit. */UNIV_INLINEbuf_frame_t*buf_page_get_release_on_io(/*=======================*/ /* out: pointer to the frame, or NULL if not in buffer buf_pool */ ulint space, /* in: space id */ ulint offset, /* in: offset of the page within space in units of a page */ buf_frame_t* guess, /* in: guessed frame or NULL */ ulint rw_latch, /* in: RW_X_LATCH, RW_S_LATCH, or RW_NO_LATCH */ ulint savepoint, /* in: mtr savepoint */ mtr_t* mtr) /* in: mtr */{ buf_frame_t* frame; frame = buf_page_get_gen(space, offset, rw_latch, guess, BUF_GET_IF_IN_POOL, __FILE__, __LINE__, mtr); if (frame != NULL) { return(frame); } /* The page was not in the buffer buf_pool: release the latches down to the savepoint */ mtr_rollback_to_savepoint(mtr, savepoint); buf_page_get(space, offset, RW_S_LATCH, mtr); /* When we get here, the page is in buffer, but we release the latches again down to the savepoint, before returning */ mtr_rollback_to_savepoint(mtr, savepoint); return(NULL);}/************************************************************************Decrements the bufferfix count of a buffer control block and releasesa latch, if specified. */UNIV_INLINEvoidbuf_page_release(/*=============*/ buf_block_t* block, /* in: buffer block */ ulint rw_latch, /* in: RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */ mtr_t* mtr) /* in: mtr */{ ulint buf_fix_count; ut_ad(block); mutex_enter_fast(&(buf_pool->mutex)); ut_a(block->state == BUF_BLOCK_FILE_PAGE); ut_a(block->buf_fix_count > 0); if (rw_latch == RW_X_LATCH && mtr->modifications) { buf_flush_note_modification(block, mtr); }#ifdef UNIV_SYNC_DEBUG rw_lock_s_unlock(&(block->debug_latch));#endif buf_fix_count = block->buf_fix_count; block->buf_fix_count = buf_fix_count - 1; mutex_exit(&(buf_pool->mutex)); if (rw_latch == RW_S_LATCH) { rw_lock_s_unlock(&(block->lock)); } else if (rw_latch == RW_X_LATCH) { rw_lock_x_unlock(&(block->lock)); }}#ifdef UNIV_SYNC_DEBUG/*************************************************************************Adds latch level info for the rw-lock protecting the buffer frame. Thisshould be called in the debug version after a successful latching of apage if we know the latching order level of the acquired latch. IfUNIV_SYNC_DEBUG is not defined, compiles to an empty function. */UNIV_INLINEvoidbuf_page_dbg_add_level(/*===================*/ buf_frame_t* frame __attribute__((unused)), /* in: buffer page where we have acquired latch */ ulint level __attribute__((unused))) /* in: latching order level */{ sync_thread_add_level(&(buf_block_align(frame)->lock), level);}#endif /* UNIV_SYNC_DEBUG */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -