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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Mini-transaction buffer
  3. (c) 1995 Innobase Oy
  4. Created 11/26/1995 Heikki Tuuri
  5. *******************************************************/
  6. #include "sync0sync.h"
  7. #include "sync0rw.h"
  8. #include "mach0data.h"
  9. /*******************************************************************
  10. Starts a mini-transaction and creates a mini-transaction handle 
  11. and a buffer in the memory buffer given by the caller. */
  12. UNIV_INLINE
  13. mtr_t*
  14. mtr_start(
  15. /*======*/
  16. /* out: mtr buffer which also acts as
  17. the mtr handle */
  18. mtr_t* mtr) /* in: memory buffer for the mtr buffer */
  19. {
  20. dyn_array_create(&(mtr->memo));
  21. dyn_array_create(&(mtr->log));
  22. mtr->log_mode = MTR_LOG_ALL;
  23. mtr->modifications = FALSE;
  24. mtr->n_log_recs = 0;
  25. #ifdef UNIV_DEBUG
  26. mtr->state = MTR_ACTIVE;
  27. mtr->magic_n = MTR_MAGIC_N;
  28. #endif
  29. return(mtr);
  30. }
  31. /*******************************************************
  32. Pushes an object to an mtr memo stack. */
  33. UNIV_INLINE
  34. void
  35. mtr_memo_push(
  36. /*==========*/
  37. mtr_t* mtr, /* in: mtr */
  38. void* object, /* in: object */
  39. ulint type) /* in: object type: MTR_MEMO_S_LOCK, ... */
  40. {
  41. dyn_array_t* memo;
  42. mtr_memo_slot_t* slot;
  43. ut_ad(object);
  44. ut_ad(type >= MTR_MEMO_PAGE_S_FIX);
  45. ut_ad(type <= MTR_MEMO_X_LOCK);
  46. ut_ad(mtr);
  47. ut_ad(mtr->magic_n == MTR_MAGIC_N);
  48. memo = &(mtr->memo);
  49. slot = dyn_array_push(memo, sizeof(mtr_memo_slot_t));
  50. slot->object = object;
  51. slot->type = type;
  52. }
  53. /**************************************************************
  54. Sets and returns a savepoint in mtr. */
  55. UNIV_INLINE
  56. ulint
  57. mtr_set_savepoint(
  58. /*==============*/
  59. /* out: savepoint */
  60. mtr_t* mtr) /* in: mtr */
  61. {
  62. dyn_array_t* memo;
  63.  
  64. ut_ad(mtr);
  65. ut_ad(mtr->magic_n == MTR_MAGIC_N);
  66. memo = &(mtr->memo);
  67. return(dyn_array_get_data_size(memo));
  68. }
  69. /**************************************************************
  70. Releases the (index tree) s-latch stored in an mtr memo after a
  71. savepoint. */
  72. UNIV_INLINE
  73. void
  74. mtr_release_s_latch_at_savepoint(
  75. /*=============================*/
  76. mtr_t* mtr, /* in: mtr */
  77. ulint savepoint, /* in: savepoint */
  78. rw_lock_t*  lock) /* in: latch to release */
  79. {
  80. mtr_memo_slot_t* slot;
  81. dyn_array_t* memo;
  82. ut_ad(mtr);
  83. ut_ad(mtr->magic_n == MTR_MAGIC_N);
  84. ut_ad(mtr->state == MTR_ACTIVE);
  85. memo = &(mtr->memo);
  86. ut_ad(dyn_array_get_data_size(memo) > savepoint);
  87. slot = dyn_array_get_element(memo, savepoint);
  88. ut_ad(slot->object == lock);
  89. ut_ad(slot->type == MTR_MEMO_S_LOCK);
  90. rw_lock_s_unlock(lock);
  91. slot->object = NULL;
  92. }
  93. /**************************************************************
  94. Checks if memo contains the given item. */
  95. UNIV_INLINE
  96. ibool
  97. mtr_memo_contains(
  98. /*==============*/
  99. /* out: TRUE if contains */
  100. mtr_t* mtr, /* in: mtr */
  101. void* object, /* in: object to search */
  102. ulint type) /* in: type of object */
  103. {
  104. mtr_memo_slot_t* slot;
  105. dyn_array_t* memo;
  106. ulint offset;
  107. ut_ad(mtr);
  108. ut_ad(mtr->magic_n == MTR_MAGIC_N);
  109. memo = &(mtr->memo);
  110. offset = dyn_array_get_data_size(memo);
  111. while (offset > 0) {
  112. offset -= sizeof(mtr_memo_slot_t);
  113. slot = dyn_array_get_element(memo, offset);
  114. if ((object == slot->object) && (type == slot->type)) {
  115. return(TRUE);
  116. }
  117. }
  118. return(FALSE);
  119. }
  120. /*******************************************************************
  121. Returns the log object of a mini-transaction buffer. */
  122. UNIV_INLINE
  123. dyn_array_t*
  124. mtr_get_log(
  125. /*========*/
  126. /* out: log */
  127. mtr_t* mtr) /* in: mini-transaction */
  128. {
  129. ut_ad(mtr);
  130. ut_ad(mtr->magic_n == MTR_MAGIC_N);
  131. return(&(mtr->log));
  132. }
  133. /*******************************************************************
  134. Gets the logging mode of a mini-transaction. */
  135. UNIV_INLINE
  136. ulint
  137. mtr_get_log_mode(
  138. /*=============*/
  139. /* out: logging mode: MTR_LOG_NONE, ... */
  140. mtr_t* mtr) /* in: mtr */
  141. {
  142. ut_ad(mtr);
  143. ut_ad(mtr->log_mode >= MTR_LOG_ALL);
  144. ut_ad(mtr->log_mode <= MTR_LOG_SHORT_INSERTS);
  145. return(mtr->log_mode);
  146. }
  147. /*******************************************************************
  148. Changes the logging mode of a mini-transaction. */
  149. UNIV_INLINE
  150. ulint
  151. mtr_set_log_mode(
  152. /*=============*/
  153. /* out: old mode */
  154. mtr_t* mtr, /* in: mtr */
  155. ulint mode) /* in: logging mode: MTR_LOG_NONE, ... */
  156. {
  157. ulint old_mode;
  158. ut_ad(mtr);
  159. ut_ad(mode >= MTR_LOG_ALL);
  160. ut_ad(mode <= MTR_LOG_SHORT_INSERTS);
  161. old_mode = mtr->log_mode;
  162. if ((mode == MTR_LOG_SHORT_INSERTS) && (old_mode == MTR_LOG_NONE)) {
  163. /* Do nothing */
  164. } else {
  165. mtr->log_mode = mode;
  166. }
  167. ut_ad(old_mode >= MTR_LOG_ALL);
  168. ut_ad(old_mode <= MTR_LOG_SHORT_INSERTS);
  169. return(old_mode);
  170. }
  171. /*************************************************************************
  172. Locks a lock in s-mode. */
  173. UNIV_INLINE
  174. void
  175. mtr_s_lock_func(
  176. /*============*/
  177. rw_lock_t* lock, /* in: rw-lock */
  178. #ifdef UNIV_SYNC_DEBUG
  179. char* file, /* in: file name */
  180. ulint line, /* in: line number */
  181. #endif
  182. mtr_t* mtr) /* in: mtr */
  183. {
  184. ut_ad(mtr);
  185. ut_ad(lock);
  186. rw_lock_s_lock_func(lock
  187. #ifdef UNIV_SYNC_DEBUG
  188. ,0, file, line
  189. #endif
  190.     );
  191. mtr_memo_push(mtr, lock, MTR_MEMO_S_LOCK);
  192. }
  193. /*************************************************************************
  194. Locks a lock in x-mode. */
  195. UNIV_INLINE
  196. void
  197. mtr_x_lock_func(
  198. /*============*/
  199. rw_lock_t* lock, /* in: rw-lock */
  200. #ifdef UNIV_SYNC_DEBUG
  201. char* file, /* in: file name */
  202. ulint line, /* in: line number */
  203. #endif
  204. mtr_t* mtr) /* in: mtr */
  205. {
  206. ut_ad(mtr);
  207. ut_ad(lock);
  208. rw_lock_x_lock_func(lock, 0
  209. #ifdef UNIV_SYNC_DEBUG
  210. , file, line
  211. #endif
  212.     );
  213. mtr_memo_push(mtr, lock, MTR_MEMO_X_LOCK);
  214. }