trx0rseg.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小: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. #ifdef UNIV_SYNC_DEBUG
  22. buf_page_dbg_add_level(header, SYNC_RSEG_HEADER);
  23. #endif /* UNIV_SYNC_DEBUG */
  24. return(header);
  25. }
  26. /**********************************************************************
  27. Gets a newly created rollback segment header. */
  28. UNIV_INLINE
  29. trx_rsegf_t*
  30. trx_rsegf_get_new(
  31. /*==============*/
  32. /* out: rollback segment header, page
  33. x-latched */
  34. ulint space, /* in: space where placed */
  35. ulint page_no, /* in: page number of the header */
  36. mtr_t* mtr) /* in: mtr */
  37. {
  38. trx_rsegf_t* header;
  39. header = TRX_RSEG + buf_page_get(space, page_no, RW_X_LATCH, mtr);
  40. #ifdef UNIV_SYNC_DEBUG
  41. buf_page_dbg_add_level(header, SYNC_RSEG_HEADER_NEW);
  42. #endif /* UNIV_SYNC_DEBUG */
  43. return(header);
  44. }
  45. /*******************************************************************
  46. Gets the file page number of the nth undo log slot. */
  47. UNIV_INLINE
  48. ulint
  49. trx_rsegf_get_nth_undo(
  50. /*===================*/
  51. /* out: page number of the undo log segment */
  52. trx_rsegf_t* rsegf, /* in: rollback segment header */
  53. ulint n, /* in: index of slot */
  54. mtr_t* mtr) /* in: mtr */
  55. {
  56. if (n >= TRX_RSEG_N_SLOTS) {
  57. fprintf(stderr,
  58. "InnoDB: Error: trying to get slot %lu of rsegn", (unsigned long) n);
  59. ut_error;
  60. }
  61. return(mtr_read_ulint(rsegf + TRX_RSEG_UNDO_SLOTS +
  62. n * TRX_RSEG_SLOT_SIZE, MLOG_4BYTES, mtr));
  63. }
  64. /*******************************************************************
  65. Sets the file page number of the nth undo log slot. */
  66. UNIV_INLINE
  67. void
  68. trx_rsegf_set_nth_undo(
  69. /*===================*/
  70. trx_rsegf_t* rsegf, /* in: rollback segment header */
  71. ulint n, /* in: index of slot */
  72. ulint page_no,/* in: page number of the undo log segment */
  73. mtr_t* mtr) /* in: mtr */
  74. {
  75. if (n >= TRX_RSEG_N_SLOTS) {
  76. fprintf(stderr,
  77. "InnoDB: Error: trying to set slot %lu of rsegn", (unsigned long) n);
  78. ut_error;
  79. }
  80. mlog_write_ulint(rsegf + TRX_RSEG_UNDO_SLOTS + n * TRX_RSEG_SLOT_SIZE,
  81. page_no, MLOG_4BYTES, mtr);
  82. }
  83. /********************************************************************
  84. Looks for a free slot for an undo log segment. */
  85. UNIV_INLINE
  86. ulint
  87. trx_rsegf_undo_find_free(
  88. /*=====================*/
  89. /* out: slot index or ULINT_UNDEFINED if not
  90. found */
  91. trx_rsegf_t* rsegf, /* in: rollback segment header */
  92. mtr_t* mtr) /* in: mtr */
  93. {
  94. ulint i;
  95. ulint page_no;
  96. for (i = 0; i < TRX_RSEG_N_SLOTS; i++) {
  97. page_no = trx_rsegf_get_nth_undo(rsegf, i, mtr);
  98. if (page_no == FIL_NULL) {
  99. return(i);
  100. }
  101. }
  102. return(ULINT_UNDEFINED);
  103. }