/****************************************************** 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); #ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_RSEG_HEADER); #endif /* UNIV_SYNC_DEBUG */ 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); #ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(header, SYNC_RSEG_HEADER_NEW); #endif /* UNIV_SYNC_DEBUG */ 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 */ { if (UNIV_UNLIKELY(n >= TRX_RSEG_N_SLOTS)) { fprintf(stderr, "InnoDB: Error: trying to get slot %lu of rseg\n", (unsigned long) n); ut_error; } 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 */ { if (UNIV_UNLIKELY(n >= TRX_RSEG_N_SLOTS)) { fprintf(stderr, "InnoDB: Error: trying to set slot %lu of rseg\n", (unsigned long) n); ut_error; } 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); }