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_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 thr_local_mutex_key;
116 extern mysql_pfs_key_t trx_undo_mutex_key;
134 #ifdef UNIV_PFS_MUTEX
158 # ifdef UNIV_SYNC_DEBUG
159 # define mutex_create(K, M, level) \
160 pfs_mutex_create_func((K), (M), #M, (level), __FILE__, __LINE__)
162 # define mutex_create(K, M, level) \
163 pfs_mutex_create_func((K), (M), #M, __FILE__, __LINE__)
166 # define mutex_create(K, M, level) \
167 pfs_mutex_create_func((K), (M), __FILE__, __LINE__)
170 # define mutex_enter(M) \
171 pfs_mutex_enter_func((M), __FILE__, __LINE__)
173 # define mutex_enter_nowait(M) \
174 pfs_mutex_enter_nowait_func((M), __FILE__, __LINE__)
176 # define mutex_exit(M) pfs_mutex_exit_func(M)
178 # define mutex_free(M) pfs_mutex_free_func(M)
185 # ifdef UNIV_SYNC_DEBUG
186 # define mutex_create(K, M, level) \
187 mutex_create_func((M), #M, (level), __FILE__, __LINE__)
189 # define mutex_create(K, M, level) \
190 mutex_create_func((M), #M, __FILE__, __LINE__)
193 # define mutex_create(K, M, level) \
194 mutex_create_func((M), __FILE__, __LINE__)
197 # define mutex_enter(M) mutex_enter_func((M), __FILE__, __LINE__)
199 # define mutex_enter_nowait(M) \
200 mutex_enter_nowait_func((M), __FILE__, __LINE__)
202 # define mutex_exit(M) mutex_exit_func(M)
204 # define mutex_free(M) mutex_free_func(M)
219 const char* cmutex_name,
220 # ifdef UNIV_SYNC_DEBUG
224 const char* cfile_name,
243 #define mutex_enter_fast(M) mutex_enter_func((M), __FILE__, __LINE__)
254 const char* file_name,
266 const char* file_name,
279 #ifdef UNIV_PFS_MUTEX
288 pfs_mutex_create_func(
293 const char* cmutex_name,
294 # ifdef UNIV_SYNC_DEBUG
298 const char* cfile_name,
307 pfs_mutex_enter_func(
310 const char* file_name,
320 pfs_mutex_enter_nowait_func(
323 const char* file_name,
350 #ifdef UNIV_SYNC_DEBUG
357 sync_all_freed(
void);
394 __attribute__((warn_unused_result));
396 #ifdef UNIV_SYNC_DEBUG
403 sync_thread_add_level(
415 sync_thread_reset_level(
423 sync_thread_levels_empty(
void);
431 sync_thread_levels_contains(
440 sync_thread_levels_nonempty_gen(
442 ibool dict_mutex_allowed);
446 #define sync_thread_levels_empty_gen(d) (!sync_thread_levels_nonempty_gen(d))
451 mutex_get_debug_info(
454 const char** file_name,
463 mutex_n_reserved(
void);
474 #ifdef UNIV_SYNC_DEBUG
609 #define SYNC_USER_TRX_LOCK 9999
610 #define SYNC_NO_ORDER_CHECK 3000
612 #define SYNC_LEVEL_VARYING 2000
618 #define SYNC_TRX_I_S_RWLOCK 1910
620 #define SYNC_TRX_I_S_LAST_READ 1900
622 #define SYNC_FILE_FORMAT_TAG 1200
624 #define SYNC_DICT_OPERATION 1001
628 #define SYNC_DICT 1000
629 #define SYNC_DICT_AUTOINC_MUTEX 999
630 #define SYNC_DICT_HEADER 995
631 #define SYNC_IBUF_HEADER 914
632 #define SYNC_IBUF_PESS_INSERT_MUTEX 912
633 #define SYNC_IBUF_MUTEX 910
638 #define SYNC_INDEX_TREE 900
639 #define SYNC_TREE_NODE_NEW 892
640 #define SYNC_TREE_NODE_FROM_HASH 891
641 #define SYNC_TREE_NODE 890
642 #define SYNC_PURGE_SYS 810
643 #define SYNC_PURGE_LATCH 800
644 #define SYNC_TRX_UNDO 700
645 #define SYNC_RSEG 600
646 #define SYNC_RSEG_HEADER_NEW 591
647 #define SYNC_RSEG_HEADER 590
648 #define SYNC_TRX_UNDO_PAGE 570
649 #define SYNC_EXTERN_STORAGE 500
651 #define SYNC_FSP_PAGE 395
655 #define SYNC_IBUF_BITMAP_MUTEX 351
656 #define SYNC_IBUF_BITMAP 350
660 #define SYNC_KERNEL 300
661 #define SYNC_REC_LOCK 299
662 #define SYNC_TRX_LOCK_HEAP 298
663 #define SYNC_TRX_SYS_HEADER 290
665 #define SYNC_LOG_FLUSH_ORDER 147
666 #define SYNC_RECV 168
667 #define SYNC_WORK_QUEUE 162
668 #define SYNC_SEARCH_SYS_CONF 161
669 #define SYNC_SEARCH_SYS 160
675 #define SYNC_COMMIT_ID_LOCK 159
676 #define SYNC_BUF_POOL 150
677 #define SYNC_BUF_BLOCK 146
678 #define SYNC_BUF_FLUSH_LIST 145
679 #define SYNC_DOUBLEWRITE 140
680 #define SYNC_ANY_LATCH 135
681 #define SYNC_THR_LOCAL 133
682 #define SYNC_MEM_HASH 131
683 #define SYNC_MEM_POOL 130
686 #define RW_LOCK_NOT_LOCKED 350
687 #define RW_LOCK_EX 351
688 #define RW_LOCK_EXCLUSIVE 351
689 #define RW_LOCK_SHARED 352
690 #define RW_LOCK_WAIT_EX 353
691 #define SYNC_MUTEX 354
704 #if !defined(HAVE_ATOMIC_BUILTINS)
715 #ifdef UNIV_SYNC_DEBUG
716 const char* file_name;
727 # define MUTEX_MAGIC_N (ulint)979585
732 ulong count_spin_loop;
733 ulong count_spin_rounds;
734 ulong count_os_yield;
735 ulonglong lspent_time;
736 ulonglong lmax_spent_time;
737 const char* cmutex_name;
740 #ifdef UNIV_PFS_MUTEX
741 struct PSI_mutex* pfs_psi;
755 #define SYNC_SPIN_ROUNDS srv_n_spin_wait_rounds
760 #ifdef UNIV_SYNC_DEBUG
762 extern ibool sync_order_checks_on;
771 extern ut_list_base_node_t mutex_list;
774 extern
mutex_t mutex_list_mutex;
778 #include "sync0sync.ic"