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;
126 extern mysql_pfs_key_t dict_table_stats_latch_key;
130 #ifndef UNIV_PFS_RWLOCK
139 # ifdef UNIV_SYNC_DEBUG
140 # define rw_lock_create(K, L, level) \
141 rw_lock_create_func((L), (level), #L, __FILE__, __LINE__)
143 # define rw_lock_create(K, L, level) \
144 rw_lock_create_func((L), #L, __FILE__, __LINE__)
147 # define rw_lock_create(K, L, level) \
148 rw_lock_create_func((L), __FILE__, __LINE__)
155 # define rw_lock_s_lock(M) \
156 rw_lock_s_lock_func((M), 0, __FILE__, __LINE__)
158 # define rw_lock_s_lock_gen(M, P) \
159 rw_lock_s_lock_func((M), (P), __FILE__, __LINE__)
161 # define rw_lock_s_lock_nowait(M, F, L) \
162 rw_lock_s_lock_low((M), 0, (F), (L))
164 # ifdef UNIV_SYNC_DEBUG
165 # define rw_lock_s_unlock_gen(L, P) rw_lock_s_unlock_func(P, L)
167 # define rw_lock_s_unlock_gen(L, P) rw_lock_s_unlock_func(L)
171 # define rw_lock_x_lock(M) \
172 rw_lock_x_lock_func((M), 0, __FILE__, __LINE__)
174 # define rw_lock_x_lock_gen(M, P) \
175 rw_lock_x_lock_func((M), (P), __FILE__, __LINE__)
177 # define rw_lock_x_lock_nowait(M) \
178 rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__)
180 # ifdef UNIV_SYNC_DEBUG
181 # define rw_lock_x_unlock_gen(L, P) rw_lock_x_unlock_func(P, L)
183 # define rw_lock_x_unlock_gen(L, P) rw_lock_x_unlock_func(L)
186 # define rw_lock_free(M) rw_lock_free_func(M)
192 # ifdef UNIV_SYNC_DEBUG
193 # define rw_lock_create(K, L, level) \
194 pfs_rw_lock_create_func((K), (L), (level), #L, __FILE__, __LINE__)
196 # define rw_lock_create(K, L, level) \
197 pfs_rw_lock_create_func((K), (L), #L, __FILE__, __LINE__)
200 # define rw_lock_create(K, L, level) \
201 pfs_rw_lock_create_func((K), (L), __FILE__, __LINE__)
208 # define rw_lock_s_lock(M) \
209 pfs_rw_lock_s_lock_func((M), 0, __FILE__, __LINE__)
211 # define rw_lock_s_lock_gen(M, P) \
212 pfs_rw_lock_s_lock_func((M), (P), __FILE__, __LINE__)
214 # define rw_lock_s_lock_nowait(M, F, L) \
215 pfs_rw_lock_s_lock_low((M), 0, (F), (L))
217 # ifdef UNIV_SYNC_DEBUG
218 # define rw_lock_s_unlock_gen(L, P) pfs_rw_lock_s_unlock_func(P, L)
220 # define rw_lock_s_unlock_gen(L, P) pfs_rw_lock_s_unlock_func(L)
223 # define rw_lock_x_lock(M) \
224 pfs_rw_lock_x_lock_func((M), 0, __FILE__, __LINE__)
226 # define rw_lock_x_lock_gen(M, P) \
227 pfs_rw_lock_x_lock_func((M), (P), __FILE__, __LINE__)
229 # define rw_lock_x_lock_nowait(M) \
230 pfs_rw_lock_x_lock_func_nowait((M), __FILE__, __LINE__)
232 # ifdef UNIV_SYNC_DEBUG
233 # define rw_lock_x_unlock_gen(L, P) pfs_rw_lock_x_unlock_func(P, L)
235 # define rw_lock_x_unlock_gen(L, P) pfs_rw_lock_x_unlock_func(L)
238 # define rw_lock_free(M) pfs_rw_lock_free_func(M)
242 #define rw_lock_s_unlock(L) rw_lock_s_unlock_gen(L, 0)
243 #define rw_lock_x_unlock(L) rw_lock_x_unlock_gen(L, 0)
256 # ifdef UNIV_SYNC_DEBUG
259 const char* cmutex_name,
261 const char* cfile_name,
295 const char* file_name,
311 const char* file_name,
323 const char* file_name,
331 #ifdef UNIV_SYNC_DEBUG
353 const char* file_name,
361 #ifdef UNIV_SYNC_DEBUG
377 const char* file_name,
388 const char* file_name,
489 #ifdef UNIV_SYNC_DEBUG
500 __attribute__((warn_unused_result));
511 #ifdef UNIV_SYNC_DEBUG
523 rw_lock_list_print_info(
532 rw_lock_n_locked(
void);
545 rw_lock_debug_mutex_enter(
void);
551 rw_lock_debug_mutex_exit(
void);
560 rw_lock_debug_t* info);
597 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
604 #ifdef UNIV_SYNC_DEBUG
610 #ifdef UNIV_PFS_RWLOCK
611 struct PSI_rwlock *pfs_psi;
631 #define RW_LOCK_MAGIC_N 22643
635 #ifdef UNIV_SYNC_DEBUG
637 struct rw_lock_debug_struct {
644 const char* file_name;
679 #ifdef UNIV_PFS_RWLOCK
686 pfs_rw_lock_create_func(
692 # ifdef UNIV_SYNC_DEBUG
695 const char* cmutex_name,
697 const char* cfile_name,
706 pfs_rw_lock_x_lock_func(
711 const char* file_name,
720 pfs_rw_lock_x_lock_func_nowait(
723 const char* file_name,
731 pfs_rw_lock_s_lock_func(
736 const char* file_name,
745 pfs_rw_lock_s_lock_low(
751 const char* file_name,
759 pfs_rw_lock_x_lock_func(
764 const char* file_name,
772 pfs_rw_lock_s_unlock_func(
774 #ifdef UNIV_SYNC_DEBUG
786 pfs_rw_lock_x_unlock_func(
788 #ifdef UNIV_SYNC_DEBUG
800 pfs_rw_lock_free_func(
807 #include "sync0rw.ic"