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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Mutex, the basic synchronization primitive
  3. (c) 1995 Innobase Oy
  4. Created 9/5/1995 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef sync0sync_h
  7. #define sync0sync_h
  8. #include "univ.i"
  9. #include "sync0types.h"
  10. #include "ut0lst.h"
  11. #include "ut0mem.h"
  12. #include "os0thread.h"
  13. #include "os0sync.h"
  14. #include "sync0arr.h"
  15. /**********************************************************************
  16. Initializes the synchronization data structures. */
  17. void
  18. sync_init(void);
  19. /*===========*/
  20. /**********************************************************************
  21. Frees the resources in synchronization data structures. */
  22. void
  23. sync_close(void);
  24. /*===========*/
  25. /**********************************************************************
  26. Creates, or rather, initializes a mutex object to a specified memory
  27. location (which must be appropriately aligned). The mutex is initialized
  28. in the reset state. Explicit freeing of the mutex with mutex_free is
  29. necessary only if the memory block containing it is freed. */
  30. #define mutex_create(M) mutex_create_func((M), IB__FILE__, __LINE__)
  31. /*===================*/
  32. /**********************************************************************
  33. Creates, or rather, initializes a mutex object in a specified memory
  34. location (which must be appropriately aligned). The mutex is initialized
  35. in the reset state. Explicit freeing of the mutex with mutex_free is
  36. necessary only if the memory block containing it is freed. */
  37. void
  38. mutex_create_func(
  39. /*==============*/
  40. mutex_t* mutex, /* in: pointer to memory */
  41. char* cfile_name, /* in: file name where created */
  42. ulint cline); /* in: file line where created */
  43. /**********************************************************************
  44. Calling this function is obligatory only if the memory buffer containing
  45. the mutex is freed. Removes a mutex object from the mutex list. The mutex
  46. is checked to be in the reset state. */
  47. void
  48. mutex_free(
  49. /*=======*/
  50. mutex_t* mutex); /* in: mutex */
  51. /******************************************************************
  52. NOTE! The following macro should be used in mutex locking, not the
  53. corresponding function. */
  54. #ifdef UNIV_SYNC_DEBUG
  55. #define mutex_enter(M)    mutex_enter_func((M), IB__FILE__, __LINE__)
  56. #else
  57. #define mutex_enter(M)    mutex_enter_func(M)
  58. #endif
  59. /******************************************************************
  60. NOTE! The following macro should be used in mutex locking, not the
  61. corresponding function. */
  62. /* NOTE! currently same as mutex_enter! */
  63. #ifdef UNIV_SYNC_DEBUG
  64. #define mutex_enter_fast(M)    mutex_enter_func((M), IB__FILE__, __LINE__)
  65. #else
  66. #define mutex_enter_fast(M)    mutex_enter_func(M)
  67. #endif
  68. #define mutex_enter_fast_func mutex_enter_func;
  69. /**********************************************************************
  70. NOTE! Use the corresponding macro in the header file, not this function
  71. directly. Locks a mutex for the current thread. If the mutex is reserved
  72. the function spins a preset time (controlled by SYNC_SPIN_ROUNDS) waiting
  73. for the mutex before suspending the thread. */
  74. UNIV_INLINE
  75. void
  76. mutex_enter_func(
  77. /*=============*/
  78. mutex_t* mutex /* in: pointer to mutex */
  79. #ifdef UNIV_SYNC_DEBUG
  80. ,char* file_name, /* in: file name where locked */
  81. ulint line /* in: line where locked */
  82. #endif
  83. );
  84. /************************************************************************
  85. Tries to lock the mutex for the current thread. If the lock is not acquired
  86. immediately, returns with return value 1. */
  87. ulint
  88. mutex_enter_nowait(
  89. /*===============*/
  90. /* out: 0 if succeed, 1 if not */
  91. mutex_t* mutex); /* in: pointer to mutex */
  92. /**********************************************************************
  93. Unlocks a mutex owned by the current thread. */
  94. UNIV_INLINE
  95. void
  96. mutex_exit(
  97. /*=======*/
  98. mutex_t* mutex); /* in: pointer to mutex */
  99. /**********************************************************************
  100. Returns TRUE if no mutex or rw-lock is currently locked.
  101. Works only in the debug version. */
  102. ibool
  103. sync_all_freed(void);
  104. /*================*/
  105. /*#####################################################################
  106. FUNCTION PROTOTYPES FOR DEBUGGING */
  107. /***********************************************************************
  108. Prints wait info of the sync system. */
  109. void
  110. sync_print_wait_info(void);
  111. /*======================*/
  112. /***********************************************************************
  113. Prints info of the sync system. */
  114. void
  115. sync_print(void);
  116. /*============*/
  117. /**********************************************************************
  118. Checks that the mutex has been initialized. */
  119. ibool
  120. mutex_validate(
  121. /*===========*/
  122. mutex_t* mutex);
  123. /**********************************************************************
  124. Sets the mutex latching level field. */
  125. void
  126. mutex_set_level(
  127. /*============*/
  128. mutex_t* mutex, /* in: mutex */
  129. ulint level); /* in: level */
  130. /**********************************************************************
  131. Adds a latch and its level in the thread level array. Allocates the memory
  132. for the array if called first time for this OS thread. Makes the checks
  133. against other latch levels stored in the array for this thread. */
  134. void
  135. sync_thread_add_level(
  136. /*==================*/
  137. void* latch, /* in: pointer to a mutex or an rw-lock */
  138. ulint level); /* in: level in the latching order; if SYNC_LEVEL_NONE,
  139. nothing is done */
  140. /**********************************************************************
  141. Removes a latch from the thread level array if it is found there. */
  142. ibool
  143. sync_thread_reset_level(
  144. /*====================*/
  145. /* out: TRUE if found from the array; it is no error
  146. if the latch is not found, as we presently are not
  147. able to determine the level for every latch
  148. reservation the program does */
  149. void* latch); /* in: pointer to a mutex or an rw-lock */
  150. /**********************************************************************
  151. Checks that the level array for the current thread is empty. */
  152. ibool
  153. sync_thread_levels_empty(void);
  154. /*==========================*/
  155. /* out: TRUE if empty */
  156. /**********************************************************************
  157. Checks that the level array for the current thread is empty. */
  158. ibool
  159. sync_thread_levels_empty_gen(
  160. /*=========================*/
  161. /* out: TRUE if empty except the
  162. exceptions specified below */
  163. ibool dict_mutex_allowed); /* in: TRUE if dictionary mutex is
  164. allowed to be owned by the thread,
  165. also purge_is_running mutex is
  166. allowed */
  167. /**********************************************************************
  168. Checks that the current thread owns the mutex. Works only
  169. in the debug version. */
  170. ibool
  171. mutex_own(
  172. /*======*/
  173. /* out: TRUE if owns */
  174. mutex_t* mutex); /* in: mutex */
  175. /**********************************************************************
  176. Gets the debug information for a reserved mutex. */
  177. void
  178. mutex_get_debug_info(
  179. /*=================*/
  180. mutex_t* mutex, /* in: mutex */
  181. char** file_name, /* out: file where requested */
  182. ulint* line, /* out: line where requested */
  183. os_thread_id_t* thread_id); /* out: id of the thread which owns
  184. the mutex */
  185. /**********************************************************************
  186. Counts currently reserved mutexes. Works only in the debug version. */
  187. ulint
  188. mutex_n_reserved(void);
  189. /*==================*/
  190. /**********************************************************************
  191. Prints debug info of currently reserved mutexes. */
  192. void
  193. mutex_list_print_info(void);
  194. /*========================*/
  195. /**********************************************************************
  196. NOT to be used outside this module except in debugging! Gets the value
  197. of the lock word. */
  198. UNIV_INLINE
  199. ulint
  200. mutex_get_lock_word(
  201. /*================*/
  202. mutex_t* mutex); /* in: mutex */
  203. /**********************************************************************
  204. NOT to be used outside this module except in debugging! Gets the waiters
  205. field in a mutex. */
  206. UNIV_INLINE
  207. ulint
  208. mutex_get_waiters(
  209. /*==============*/
  210. /* out: value to set */
  211. mutex_t* mutex); /* in: mutex */
  212. /**********************************************************************
  213. Implements the memory barrier operation which makes a serialization point to
  214. the instruction flow. This is needed because the Pentium may speculatively
  215. execute reads before preceding writes are committed. We could also use here
  216. any LOCKed instruction (see Intel Software Dev. Manual, Vol. 3). */
  217. void
  218. mutex_fence(void);
  219. /*=============*/
  220. /*
  221. LATCHING ORDER WITHIN THE DATABASE
  222. ==================================
  223. The mutex or latch in the central memory object, for instance, a rollback
  224. segment object, must be acquired before acquiring the latch or latches to
  225. the corresponding file data structure. In the latching order below, these
  226. file page object latches are placed immediately below the corresponding
  227. central memory object latch or mutex.
  228. Synchronization object Notes
  229. ---------------------- -----
  230. Dictionary mutex If we have a pointer to a dictionary
  231. | object, e.g., a table, it can be
  232. | accessed without reserving the
  233. | dictionary mutex. We must have a
  234. | reservation, a memoryfix, to the
  235. | appropriate table object in this case,
  236. | and the table must be explicitly
  237. | released later.
  238. V
  239. Dictionary header
  240. |
  241. V
  242. Secondary index tree latch The tree latch protects also all
  243. | the B-tree non-leaf pages. These
  244. V can be read with the page only
  245. Secondary index non-leaf bufferfixed to save CPU time,
  246. | no s-latch is needed on the page.
  247. | Modification of a page requires an
  248. | x-latch on the page, however. If a
  249. | thread owns an x-latch to the tree,
  250. | it is allowed to latch non-leaf pages
  251. | even after it has acquired the fsp
  252. | latch.
  253. V
  254. Secondary index leaf The latch on the secondary index leaf
  255. | can be kept while accessing the
  256. | clustered index, to save CPU time.
  257. V
  258. Clustered index tree latch To increase concurrency, the tree
  259. | latch is usually released when the
  260. | leaf page latch has been acquired.
  261. V
  262. Clustered index non-leaf
  263. |
  264. V
  265. Clustered index leaf
  266. |
  267. V
  268. Transaction system header
  269. |
  270. V
  271. Transaction undo mutex The undo log entry must be written
  272. | before any index page is modified.
  273. | Transaction undo mutex is for the undo
  274. | logs the analogue of the tree latch
  275. | for a B-tree. If a thread has the
  276. | trx undo mutex reserved, it is allowed
  277. | to latch the undo log pages in any
  278. | order, and also after it has acquired
  279. | the fsp latch. 
  280. V
  281. Rollback segment mutex The rollback segment mutex must be
  282. | reserved, if, e.g., a new page must
  283. | be added to an undo log. The rollback
  284. | segment and the undo logs in its
  285. | history list can be seen as an
  286. | analogue of a B-tree, and the latches
  287. | reserved similarly, using a version of
  288. | lock-coupling. If an undo log must be
  289. | extended by a page when inserting an
  290. | undo log record, this corresponds to
  291. | a pessimistic insert in a B-tree.
  292. V
  293. Rollback segment header
  294. |
  295. V
  296. Purge system latch
  297. |
  298. V
  299. Undo log pages If a thread owns the trx undo mutex,
  300. | or for a log in the history list, the
  301. | rseg mutex, it is allowed to latch
  302. | undo log pages in any order, and even
  303. | after it has acquired the fsp latch.
  304. | If a thread does not have the
  305. | appropriate mutex, it is allowed to
  306. | latch only a single undo log page in
  307. | a mini-transaction.
  308. V
  309. File space management latch If a mini-transaction must allocate
  310. | several file pages, it can do that,
  311. | because it keeps the x-latch to the
  312. | file space management in its memo.
  313. V
  314. File system pages
  315. |
  316. V
  317. Kernel mutex If a kernel operation needs a file
  318. | page allocation, it must reserve the
  319. | fsp x-latch before acquiring the kernel
  320. | mutex.
  321. V
  322. Search system mutex
  323. |
  324. V
  325. Buffer pool mutex
  326. |
  327. V
  328. Log mutex
  329. |
  330. Any other latch
  331. |
  332. V
  333. Memory pool mutex */
  334. /* Latching order levels */
  335. #define SYNC_NO_ORDER_CHECK 3000 /* this can be used to suppress
  336. latching order checking */
  337. #define SYNC_LEVEL_NONE 2000 /* default: level not defined */
  338. #define SYNC_DICT 1000
  339. #define SYNC_PURGE_IS_RUNNING 997
  340. #define SYNC_DICT_HEADER 995
  341. #define SYNC_IBUF_HEADER 914
  342. #define SYNC_IBUF_PESS_INSERT_MUTEX 912
  343. #define SYNC_IBUF_MUTEX 910 /* ibuf mutex is really below
  344. SYNC_FSP_PAGE: we assign value this
  345. high only to get the program to pass
  346. the debug checks */
  347. /*-------------------------------*/
  348. #define SYNC_INDEX_TREE 900
  349. #define SYNC_TREE_NODE_NEW 892
  350. #define SYNC_TREE_NODE_FROM_HASH 891
  351. #define SYNC_TREE_NODE 890
  352. #define SYNC_PURGE_SYS 810
  353. #define SYNC_PURGE_LATCH 800
  354. #define SYNC_TRX_UNDO 700
  355. #define SYNC_RSEG 600
  356. #define SYNC_RSEG_HEADER_NEW 591
  357. #define SYNC_RSEG_HEADER 590
  358. #define SYNC_TRX_UNDO_PAGE 570
  359. #define SYNC_FSP 400
  360. #define SYNC_FSP_PAGE 395
  361. /*------------------------------------- Insert buffer headers */ 
  362. /*------------------------------------- ibuf_mutex */
  363. /*------------------------------------- Insert buffer trees */
  364. #define SYNC_IBUF_BITMAP_MUTEX 351
  365. #define SYNC_IBUF_BITMAP 350
  366. /*-------------------------------*/
  367. #define SYNC_KERNEL 300
  368. #define SYNC_REC_LOCK 299
  369. #define SYNC_TRX_LOCK_HEAP 298
  370. #define SYNC_TRX_SYS_HEADER 290
  371. #define SYNC_LOG 170
  372. #define SYNC_RECV 168
  373. #define SYNC_SEARCH_SYS 160 /* NOTE that if we have a memory
  374. heap that can be extended to the
  375. buffer pool, its logical level is
  376. SYNC_SEARCH_SYS, as memory allocation
  377. can call routines there! Otherwise
  378. the level is SYNC_MEM_HASH. */
  379. #define SYNC_BUF_POOL 150
  380. #define SYNC_BUF_BLOCK 149
  381. #define SYNC_ANY_LATCH 135
  382. #define SYNC_MEM_HASH 131
  383. #define SYNC_MEM_POOL 130
  384. /* Codes used to designate lock operations */
  385. #define RW_LOCK_NOT_LOCKED  350
  386. #define RW_LOCK_EX 351
  387. #define RW_LOCK_EXCLUSIVE 351
  388. #define RW_LOCK_SHARED 352
  389. #define RW_LOCK_WAIT_EX 353
  390. #define SYNC_MUTEX 354
  391. #define MUTEX_CNAME_LEN 8
  392. /* NOTE! The structure appears here only for the compiler to know its size.
  393. Do not use its fields directly! The structure used in the spin lock
  394. implementation of a mutual exclusion semaphore. */
  395. struct mutex_struct {
  396. ulint lock_word; /* This ulint is the target of the atomic
  397. test-and-set instruction in Win32 */
  398. #ifndef _WIN32
  399. os_fast_mutex_t
  400. os_fast_mutex; /* In other systems we use this OS mutex
  401. in place of lock_word */
  402. #endif
  403. ulint waiters; /* This ulint is set to 1 if there are (or
  404. may be) threads waiting in the global wait
  405. array for this mutex to be released.
  406. Otherwise, this is 0. */
  407. UT_LIST_NODE_T(mutex_t) list; /* All allocated mutexes are put into
  408. a list. Pointers to the next and prev. */
  409. os_thread_id_t thread_id; /* Debug version: The thread id of the
  410. thread which locked the mutex. */
  411. char* file_name; /* Debug version: File name where the mutex
  412. was locked */
  413. ulint line; /* Debug version: Line where the mutex was
  414. locked */
  415. ulint level; /* Debug version: level in the global latching
  416. order; default SYNC_LEVEL_NONE */
  417. char cfile_name[MUTEX_CNAME_LEN];
  418. /* File name where mutex created */
  419. ulint cline; /* Line where created */
  420. ulint magic_n;
  421. };
  422. #define MUTEX_MAGIC_N (ulint)979585
  423. /* The global array of wait cells for implementation of the databases own
  424. mutexes and read-write locks. Appears here for debugging purposes only! */
  425. extern sync_array_t* sync_primary_wait_array;
  426. /* Constant determining how long spin wait is continued before suspending
  427. the thread. A value 600 rounds on a 1995 100 MHz Pentium seems to correspond
  428. to 20 microseconds. */
  429. #define SYNC_SPIN_ROUNDS srv_n_spin_wait_rounds
  430. #define SYNC_INFINITE_TIME ((ulint)(-1))
  431. /* Means that a timeout elapsed when waiting */
  432. #define SYNC_TIME_EXCEEDED (ulint)1
  433. /* The number of system calls made in this module. Intended for performance
  434. monitoring. */
  435. extern  ulint mutex_system_call_count;
  436. extern ulint mutex_exit_count;
  437. /* Latching order checks start when this is set TRUE */
  438. extern ibool sync_order_checks_on;
  439. /* This variable is set to TRUE when sync_init is called */
  440. extern ibool sync_initialized;
  441. #ifndef UNIV_NONINL
  442. #include "sync0sync.ic"
  443. #endif
  444. #endif