diff options
Diffstat (limited to 'innobase/include/trx0rseg.ic')
-rw-r--r-- | innobase/include/trx0rseg.ic | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/innobase/include/trx0rseg.ic b/innobase/include/trx0rseg.ic new file mode 100644 index 00000000000..aeb4466ff0f --- /dev/null +++ b/innobase/include/trx0rseg.ic @@ -0,0 +1,112 @@ +/****************************************************** +Rollback segment + +(c) 1996 Innobase Oy + +Created 3/26/1996 Heikki Tuuri +*******************************************************/ + +#include "srv0srv.h" + +/********************************************************************** +Gets a rollback segment header. */ +UNIV_INLINE +trx_rsegf_t* +trx_rsegf_get( +/*==========*/ + /* out: rollback segment header, page + x-latched */ + ulint space, /* in: space where placed */ + ulint page_no, /* in: page number of the header */ + mtr_t* mtr) /* in: mtr */ +{ + trx_rsegf_t* header; + + header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr); + + buf_page_dbg_add_level(header, SYNC_RSEG_HEADER); + + return(header); +} + +/********************************************************************** +Gets a newly created rollback segment header. */ +UNIV_INLINE +trx_rsegf_t* +trx_rsegf_get_new( +/*==============*/ + /* out: rollback segment header, page + x-latched */ + ulint space, /* in: space where placed */ + ulint page_no, /* in: page number of the header */ + mtr_t* mtr) /* in: mtr */ +{ + trx_rsegf_t* header; + + header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr); + + buf_page_dbg_add_level(header, SYNC_RSEG_HEADER_NEW); + + return(header); +} + +/******************************************************************* +Gets the file page number of the nth undo log slot. */ +UNIV_INLINE +ulint +trx_rsegf_get_nth_undo( +/*===================*/ + /* out: page number of the undo log segment */ + trx_rsegf_t* rsegf, /* in: rollback segment header */ + ulint n, /* in: index of slot */ + mtr_t* mtr) /* in: mtr */ +{ + ut_ad(n < TRX_RSEG_N_SLOTS); + + return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + + n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr)); +} + +/******************************************************************* +Sets the file page number of the nth undo log slot. */ +UNIV_INLINE +void +trx_rsegf_set_nth_undo( +/*===================*/ + trx_rsegf_t* rsegf, /* in: rollback segment header */ + ulint n, /* in: index of slot */ + ulint page_no,/* in: page number of the undo log segment */ + mtr_t* mtr) /* in: mtr */ +{ + ut_ad(n < TRX_RSEG_N_SLOTS); + + mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE, + page_no, MLOG_4BYTES, mtr); +} + +/******************************************************************** +Looks for a free slot for an undo log segment. */ +UNIV_INLINE +ulint +trx_rsegf_undo_find_free( +/*=====================*/ + /* out: slot index or ULINT_UNDEFINED if not + found */ + trx_rsegf_t* rsegf, /* in: rollback segment header */ + mtr_t* mtr) /* in: mtr */ +{ + ulint i; + ulint page_no; + + for (i = 0; i < TRX_RSEG_N_SLOTS; i++) { + + page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr); + + if (page_no == FIL_NULL) { + + return(i); + } + } + + return(ULINT_UNDEFINED); +} |