45 #if defined(UNIV_DEBUG) && !defined(UNIV_HOTBACKUP)
46 extern my_bool timed_mutexes;
49 #ifdef HAVE_WINDOWS_ATOMICS
50 typedef LONG lock_word_t;
53 typedef byte lock_word_t;
56 #if defined UNIV_PFS_MUTEX || defined UNIV_PFS_RWLOCK
62 # define PFS_NOT_INSTRUMENTED ULINT32_UNDEFINED
64 # define PFS_IS_INSTRUMENTED(key) ((key) != PFS_NOT_INSTRUMENTED)
68 # define PFS_SKIP_BUFFER_MUTEX_RWLOCK
74 extern mysql_pfs_key_t autoinc_mutex_key;
75 extern mysql_pfs_key_t btr_search_enabled_mutex_key;
76 extern mysql_pfs_key_t buffer_block_mutex_key;
77 extern mysql_pfs_key_t buf_pool_mutex_key;
78 extern mysql_pfs_key_t buf_pool_zip_mutex_key;
79 extern mysql_pfs_key_t cache_last_read_mutex_key;
80 extern mysql_pfs_key_t dict_foreign_err_mutex_key;
81 extern mysql_pfs_key_t dict_sys_mutex_key;
82 extern mysql_pfs_key_t file_format_max_mutex_key;
83 extern mysql_pfs_key_t fil_system_mutex_key;
84 extern mysql_pfs_key_t flush_list_mutex_key;
85 extern mysql_pfs_key_t hash_table_mutex_key;
86 extern mysql_pfs_key_t ibuf_bitmap_mutex_key;
87 extern mysql_pfs_key_t ibuf_mutex_key;
88 extern mysql_pfs_key_t ibuf_pessimistic_insert_mutex_key;
89 extern mysql_pfs_key_t log_sys_mutex_key;
90 extern mysql_pfs_key_t log_flush_order_mutex_key;
91 extern mysql_pfs_key_t kernel_mutex_key;
92 extern mysql_pfs_key_t commit_id_mutex_key;
93 # ifdef UNIV_MEM_DEBUG
94 extern mysql_pfs_key_t mem_hash_mutex_key;
96 extern mysql_pfs_key_t mem_pool_mutex_key;
97 extern mysql_pfs_key_t mutex_list_mutex_key;
98 extern mysql_pfs_key_t purge_sys_bh_mutex_key;
99 extern mysql_pfs_key_t recv_sys_mutex_key;
100 extern mysql_pfs_key_t rseg_mutex_key;
101 # ifdef UNIV_SYNC_DEBUG
102 extern mysql_pfs_key_t rw_lock_debug_mutex_key;
104 extern mysql_pfs_key_t rw_lock_list_mutex_key;
105 extern mysql_pfs_key_t rw_lock_mutex_key;
106 extern mysql_pfs_key_t srv_dict_tmpfile_mutex_key;
107 extern mysql_pfs_key_t srv_innodb_monitor_mutex_key;
108 extern mysql_pfs_key_t srv_misc_tmpfile_mutex_key;
109 extern mysql_pfs_key_t srv_monitor_file_mutex_key;
110 extern mysql_pfs_key_t syn_arr_mutex_key;
111 # ifdef UNIV_SYNC_DEBUG
112 extern mysql_pfs_key_t sync_thread_mutex_key;
114 extern mysql_pfs_key_t trx_doublewrite_mutex_key;
115 extern mysql_pfs_key_t trx_undo_mutex_key;
133 #ifdef UNIV_PFS_MUTEX
157 # ifdef UNIV_SYNC_DEBUG
158 # define mutex_create(K, M, level) \
159 pfs_mutex_create_func((K), (M), #M, (level), __FILE__, __LINE__)
161 # define mutex_create(K, M, level) \
162 pfs_mutex_create_func((K), (M), #M, __FILE__, __LINE__)
165 # define mutex_create(K, M, level) \
166 pfs_mutex_create_func((K), (M), __FILE__, __LINE__)
169 # define mutex_enter(M) \
170 pfs_mutex_enter_func((M), __FILE__, __LINE__)
172 # define mutex_enter_nowait(M) \
173 pfs_mutex_enter_nowait_func((M), __FILE__, __LINE__)
175 # define mutex_exit(M) pfs_mutex_exit_func(M)
177 # define mutex_free(M) pfs_mutex_free_func(M)
184 # ifdef UNIV_SYNC_DEBUG
185 # define mutex_create(K, M, level) \
186 mutex_create_func((M), #M, (level), __FILE__, __LINE__)
188 # define mutex_create(K, M, level) \
189 mutex_create_func((M), #M, __FILE__, __LINE__)
192 # define mutex_create(K, M, level) \
193 mutex_create_func((M), __FILE__, __LINE__)
196 # define mutex_enter(M) mutex_enter_func((M), __FILE__, __LINE__)
198 # define mutex_enter_nowait(M) \
199 mutex_enter_nowait_func((M), __FILE__, __LINE__)
201 # define mutex_exit(M) mutex_exit_func(M)
203 # define mutex_free(M) mutex_free_func(M)
218 const char* cmutex_name,
219 # ifdef UNIV_SYNC_DEBUG
223 const char* cfile_name,
242 #define mutex_enter_fast(M) mutex_enter_func((M), __FILE__, __LINE__)
253 const char* file_name,
265 const char* file_name,
278 #ifdef UNIV_PFS_MUTEX
287 pfs_mutex_create_func(
292 const char* cmutex_name,
293 # ifdef UNIV_SYNC_DEBUG
297 const char* cfile_name,
306 pfs_mutex_enter_func(
309 const char* file_name,
319 pfs_mutex_enter_nowait_func(
322 const char* file_name,
349 #ifdef UNIV_SYNC_DEBUG
356 sync_all_freed(
void);
393 __attribute__((warn_unused_result));
395 #ifdef UNIV_SYNC_DEBUG
402 sync_thread_add_level(
414 sync_thread_reset_level(
422 sync_thread_levels_empty(
void);
430 sync_thread_levels_contains(
439 sync_thread_levels_nonempty_gen(
441 ibool dict_mutex_allowed);
445 #define sync_thread_levels_empty_gen(d) (!sync_thread_levels_nonempty_gen(d))
450 mutex_get_debug_info(
453 const char** file_name,
462 mutex_n_reserved(
void);
473 #ifdef UNIV_SYNC_DEBUG
608 #define SYNC_USER_TRX_LOCK 9999
609 #define SYNC_NO_ORDER_CHECK 3000
611 #define SYNC_LEVEL_VARYING 2000
617 #define SYNC_TRX_I_S_RWLOCK 1910
619 #define SYNC_TRX_I_S_LAST_READ 1900
621 #define SYNC_FILE_FORMAT_TAG 1200
623 #define SYNC_DICT_OPERATION 1001
627 #define SYNC_DICT 1000
628 #define SYNC_DICT_AUTOINC_MUTEX 999
629 #define SYNC_DICT_HEADER 995
630 #define SYNC_IBUF_HEADER 914
631 #define SYNC_IBUF_PESS_INSERT_MUTEX 912
632 #define SYNC_IBUF_MUTEX 910
637 #define SYNC_INDEX_TREE 900
638 #define SYNC_TREE_NODE_NEW 892
639 #define SYNC_TREE_NODE_FROM_HASH 891
640 #define SYNC_TREE_NODE 890
641 #define SYNC_PURGE_LATCH 800
642 #define SYNC_TRX_UNDO 700
643 #define SYNC_RSEG 600
644 #define SYNC_RSEG_HEADER_NEW 591
645 #define SYNC_RSEG_HEADER 590
646 #define SYNC_TRX_UNDO_PAGE 570
647 #define SYNC_EXTERN_STORAGE 500
649 #define SYNC_FSP_PAGE 395
653 #define SYNC_IBUF_BITMAP_MUTEX 351
654 #define SYNC_IBUF_BITMAP 350
658 #define SYNC_KERNEL 300
659 #define SYNC_REC_LOCK 299
660 #define SYNC_TRX_LOCK_HEAP 298
661 #define SYNC_TRX_SYS_HEADER 290
662 #define SYNC_PURGE_QUEUE 200
664 #define SYNC_LOG_FLUSH_ORDER 147
665 #define SYNC_RECV 168
666 #define SYNC_WORK_QUEUE 162
667 #define SYNC_SEARCH_SYS_CONF 161
668 #define SYNC_SEARCH_SYS 160
674 #define SYNC_COMMIT_ID_LOCK 159
675 #define SYNC_BUF_POOL 150
676 #define SYNC_BUF_BLOCK 146
677 #define SYNC_BUF_FLUSH_LIST 145
678 #define SYNC_DOUBLEWRITE 140
679 #define SYNC_ANY_LATCH 135
680 #define SYNC_THR_LOCAL 133
681 #define SYNC_MEM_HASH 131
682 #define SYNC_MEM_POOL 130
685 #define RW_LOCK_NOT_LOCKED 350
686 #define RW_LOCK_EX 351
687 #define RW_LOCK_EXCLUSIVE 351
688 #define RW_LOCK_SHARED 352
689 #define RW_LOCK_WAIT_EX 353
690 #define SYNC_MUTEX 354
703 #if !defined(HAVE_ATOMIC_BUILTINS)
714 #ifdef UNIV_SYNC_DEBUG
715 const char* file_name;
726 # define MUTEX_MAGIC_N (ulint)979585
731 ulong count_spin_loop;
732 ulong count_spin_rounds;
733 ulong count_os_yield;
734 ulonglong lspent_time;
735 ulonglong lmax_spent_time;
736 const char* cmutex_name;
739 #ifdef UNIV_PFS_MUTEX
740 struct PSI_mutex* pfs_psi;
754 #define SYNC_SPIN_ROUNDS srv_n_spin_wait_rounds
759 #ifdef UNIV_SYNC_DEBUG
761 extern ibool sync_order_checks_on;
770 extern ut_list_base_node_t mutex_list;
773 extern
mutex_t mutex_list_mutex;
777 #include "sync0sync.ic"