trx0rseg.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Rollback segment
  3. (c) 1996 Innobase Oy
  4. Created 3/26/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "srv0srv.h"
  7. /**********************************************************************
  8. Gets a rollback segment header. */
  9. UNIV_INLINE
  10. trx_rsegf_t*
  11. trx_rsegf_get(
  12. /*==========*/
  13. /* out: rollback segment header, page
  14. x-latched */
  15. ulint space, /* in: space where placed */
  16. ulint page_no, /* in: page number of the header */
  17. mtr_t* mtr) /* in: mtr */
  18. {
  19. trx_rsegf_t* header;
  20. header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr);
  21. buf_page_dbg_add_level(header, SYNC_RSEG_HEADER);
  22. return(header);
  23. }
  24. /**********************************************************************
  25. Gets a newly created rollback segment header. */
  26. UNIV_INLINE
  27. trx_rsegf_t*
  28. trx_rsegf_get_new(
  29. /*==============*/
  30. /* out: rollback segment header, page
  31. x-latched */
  32. ulint space, /* in: space where placed */
  33. ulint page_no, /* in: page number of the header */
  34. mtr_t* mtr) /* in: mtr */
  35. {
  36. trx_rsegf_t* header;
  37. header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr);
  38. buf_page_dbg_add_level(header, SYNC_RSEG_HEADER_NEW);
  39. return(header);
  40. }
  41. /*******************************************************************
  42. Gets the file page number of the nth undo log slot. */
  43. UNIV_INLINE
  44. ulint
  45. trx_rsegf_get_nth_undo(
  46. /*===================*/
  47. /* out: page number of the undo log segment */
  48. trx_rsegf_t* rsegf, /* in: rollback segment header */
  49. ulint n, /* in: index of slot */
  50. mtr_t* mtr) /* in: mtr */
  51. {
  52. ut_ad(n < TRX_RSEG_N_SLOTS);
  53. return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS +
  54. n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr));
  55. }
  56. /*******************************************************************
  57. Sets the file page number of the nth undo log slot. */
  58. UNIV_INLINE
  59. void
  60. trx_rsegf_set_nth_undo(
  61. /*===================*/
  62. trx_rsegf_t* rsegf, /* in: rollback segment header */
  63. ulint n, /* in: index of slot */
  64. ulint page_no,/* in: page number of the undo log segment */
  65. mtr_t* mtr) /* in: mtr */
  66. {
  67. ut_ad(n < TRX_RSEG_N_SLOTS);
  68. mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE,
  69. page_no, MLOG_4BYTES, mtr);
  70. }
  71. /********************************************************************
  72. Looks for a free slot for an undo log segment. */
  73. UNIV_INLINE
  74. ulint
  75. trx_rsegf_undo_find_free(
  76. /*=====================*/
  77. /* out: slot index or ULINT_UNDEFINED if not
  78. found */
  79. trx_rsegf_t* rsegf, /* in: rollback segment header */
  80. mtr_t* mtr) /* in: mtr */
  81. {
  82. ulint i;
  83. ulint page_no;
  84. for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
  85. page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);
  86. if (page_no == FIL_NULL) {
  87. return(i);
  88. }
  89. }
  90. return(ULINT_UNDEFINED);
  91. }