38 #ifndef UNIV_HOTBACKUP
54 #ifndef UNIV_HOTBACKUP
59 #define X_LOCK_DECR 0x00100000
62 #ifdef UNIV_SYNC_DEBUG
63 typedef struct rw_lock_debug_struct rw_lock_debug_t;
68 extern rw_lock_list_t rw_lock_list;
69 extern
mutex_t rw_lock_list_mutex;
71 #ifdef UNIV_SYNC_DEBUG
76 extern mutex_t rw_lock_debug_mutex;
80 extern ibool rw_lock_debug_waiters;
109 #ifdef UNIV_PFS_RWLOCK
112 # ifdef UNIV_LOG_ARCHIVE
113 extern mysql_pfs_key_t archive_lock_key;
115 extern mysql_pfs_key_t btr_search_latch_key;
116 extern mysql_pfs_key_t buf_block_lock_key;
117 # ifdef UNIV_SYNC_DEBUG
118 extern mysql_pfs_key_t buf_block_debug_latch_key;
120 extern mysql_pfs_key_t dict_operation_lock_key;
121 extern mysql_pfs_key_t fil_space_latch_key;
122 extern mysql_pfs_key_t checkpoint_lock_key;
123 extern mysql_pfs_key_t trx_i_s_cache_lock_key;
124 extern mysql_pfs_key_t trx_purge_latch_key;
125 extern mysql_pfs_key_t index_tree_rw_lock_key;
129 #ifndef UNIV_PFS_RWLOCK
138 # ifdef UNIV_SYNC_DEBUG
139 # define rw_lock_create(K, L, level) \
140 rw_lock_create_func((L), (level), #L, __FILE__, __LINE__)
142 # define rw_lock_create(K, L, level) \
143 rw_lock_create_func((L), #L, __FILE__, __LINE__)
146 # define rw_lock_create(K, L, level) \
147 rw_lock_create_func((L), __FILE__, __LINE__)
154 # define rw_lock_s_lock(M) \
155 rw_lock_s_lock_func((M), 0, __FILE__, __LINE__)
157 # define rw_lock_s_lock_gen(M, P) \
158 rw_lock_s_lock_func((M), (P), __FILE__, __LINE__)
160 # define rw_lock_s_lock_nowait(M, F, L) \
161 rw_lock_s_lock_low((M), 0, (F), (L))
163 # ifdef UNIV_SYNC_DEBUG
164 # define rw_lock_s_unlock_gen(L, P) rw_lock_s_unlock_func(P, L)
166 # define rw_lock_s_unlock_gen(L, P) rw_lock_s_unlock_func(L)
170 # define rw_lock_x_lock(M) \
171 rw_lock_x_lock_func((M), 0, __FILE__, __LINE__)
173 # define rw_lock_x_lock_gen(M, P) \
174 rw_lock_x_lock_func((M), (P), __FILE__, __LINE__)
176 # define rw_lock_x_lock_nowait(M) \
177 rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__)
179 # ifdef UNIV_SYNC_DEBUG
180 # define rw_lock_x_unlock_gen(L, P) rw_lock_x_unlock_func(P, L)
182 # define rw_lock_x_unlock_gen(L, P) rw_lock_x_unlock_func(L)
185 # define rw_lock_free(M) rw_lock_free_func(M)
191 # ifdef UNIV_SYNC_DEBUG
192 # define rw_lock_create(K, L, level) \
193 pfs_rw_lock_create_func((K), (L), (level), #L, __FILE__, __LINE__)
195 # define rw_lock_create(K, L, level) \
196 pfs_rw_lock_create_func((K), (L), #L, __FILE__, __LINE__)
199 # define rw_lock_create(K, L, level) \
200 pfs_rw_lock_create_func((K), (L), __FILE__, __LINE__)
207 # define rw_lock_s_lock(M) \
208 pfs_rw_lock_s_lock_func((M), 0, __FILE__, __LINE__)
210 # define rw_lock_s_lock_gen(M, P) \
211 pfs_rw_lock_s_lock_func((M), (P), __FILE__, __LINE__)
213 # define rw_lock_s_lock_nowait(M, F, L) \
214 pfs_rw_lock_s_lock_low((M), 0, (F), (L))
216 # ifdef UNIV_SYNC_DEBUG
217 # define rw_lock_s_unlock_gen(L, P) pfs_rw_lock_s_unlock_func(P, L)
219 # define rw_lock_s_unlock_gen(L, P) pfs_rw_lock_s_unlock_func(L)
222 # define rw_lock_x_lock(M) \
223 pfs_rw_lock_x_lock_func((M), 0, __FILE__, __LINE__)
225 # define rw_lock_x_lock_gen(M, P) \
226 pfs_rw_lock_x_lock_func((M), (P), __FILE__, __LINE__)
228 # define rw_lock_x_lock_nowait(M) \
229 pfs_rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__)
231 # ifdef UNIV_SYNC_DEBUG
232 # define rw_lock_x_unlock_gen(L, P) pfs_rw_lock_x_unlock_func(P, L)
234 # define rw_lock_x_unlock_gen(L, P) pfs_rw_lock_x_unlock_func(L)
237 # define rw_lock_free(M) pfs_rw_lock_free_func(M)
241 #define rw_lock_s_unlock(L) rw_lock_s_unlock_gen(L, 0)
242 #define rw_lock_x_unlock(L) rw_lock_x_unlock_gen(L, 0)
255 # ifdef UNIV_SYNC_DEBUG
258 const char* cmutex_name,
260 const char* cfile_name,
294 const char* file_name,
310 const char* file_name,
322 const char* file_name,
330 #ifdef UNIV_SYNC_DEBUG
352 const char* file_name,
360 #ifdef UNIV_SYNC_DEBUG
376 const char* file_name,
387 const char* file_name,
488 #ifdef UNIV_SYNC_DEBUG
499 __attribute__((warn_unused_result));
510 #ifdef UNIV_SYNC_DEBUG
522 rw_lock_list_print_info(
531 rw_lock_n_locked(
void);
544 rw_lock_debug_mutex_enter(
void);
550 rw_lock_debug_mutex_exit(
void);
558 rw_lock_debug_t* info);
595 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
602 #ifdef UNIV_SYNC_DEBUG
608 #ifdef UNIV_PFS_RWLOCK
609 struct PSI_rwlock *pfs_psi;
629 #define RW_LOCK_MAGIC_N 22643
633 #ifdef UNIV_SYNC_DEBUG
635 struct rw_lock_debug_struct {
642 const char* file_name;
677 #ifdef UNIV_PFS_RWLOCK
684 pfs_rw_lock_create_func(
690 # ifdef UNIV_SYNC_DEBUG
693 const char* cmutex_name,
695 const char* cfile_name,
704 pfs_rw_lock_x_lock_func(
709 const char* file_name,
718 pfs_rw_lock_x_lock_func_nowait(
721 const char* file_name,
729 pfs_rw_lock_s_lock_func(
734 const char* file_name,
743 pfs_rw_lock_s_lock_low(
749 const char* file_name,
757 pfs_rw_lock_x_lock_func(
762 const char* file_name,
770 pfs_rw_lock_s_unlock_func(
772 #ifdef UNIV_SYNC_DEBUG
784 pfs_rw_lock_x_unlock_func(
786 #ifdef UNIV_SYNC_DEBUG
798 pfs_rw_lock_free_func(
805 #include "sync0rw.ic"