169 UNIV_INTERN rw_lock_list_t rw_lock_list;
170 UNIV_INTERN
mutex_t rw_lock_list_mutex;
172 #ifdef UNIV_PFS_MUTEX
173 UNIV_INTERN mysql_pfs_key_t rw_lock_list_mutex_key;
174 UNIV_INTERN mysql_pfs_key_t rw_lock_mutex_key;
177 #ifdef UNIV_SYNC_DEBUG
182 UNIV_INTERN
mutex_t rw_lock_debug_mutex;
184 # ifdef UNIV_PFS_MUTEX
185 UNIV_INTERN mysql_pfs_key_t rw_lock_debug_mutex_key;
192 UNIV_INTERN ibool rw_lock_debug_waiters;
198 rw_lock_debug_create(
void);
206 rw_lock_debug_t* info);
213 rw_lock_debug_create(
void)
216 return((rw_lock_debug_t*) mem_alloc(
sizeof(rw_lock_debug_t)));
225 rw_lock_debug_t* info)
242 # ifdef UNIV_SYNC_DEBUG
245 const char* cmutex_name,
247 const char* cfile_name,
253 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
254 mutex_create(rw_lock_mutex_key, rw_lock_get_mutex(lock),
255 SYNC_NO_ORDER_CHECK);
260 ut_d(lock->
mutex.cmutex_name = cmutex_name);
279 #ifdef UNIV_SYNC_DEBUG
285 ut_d(lock->magic_n = RW_LOCK_MAGIC_N);
288 lock->
cline = (
unsigned int) cline;
298 mutex_enter(&rw_lock_list_mutex);
305 mutex_exit(&rw_lock_list_mutex);
318 ut_ad(rw_lock_validate(lock));
321 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
322 mutex_free(rw_lock_get_mutex(lock));
325 mutex_enter(&rw_lock_list_mutex);
337 mutex_exit(&rw_lock_list_mutex);
339 ut_d(lock->magic_n = 0);
361 ut_ad(lock->magic_n == RW_LOCK_MAGIC_N);
362 ut_a(waiters == 0 || waiters == 1);
363 ut_a(lock_word > -X_LOCK_DECR ||(-lock_word) % X_LOCK_DECR == 0);
381 const char* file_name,
387 ut_ad(rw_lock_validate(lock));
393 while (i < SYNC_SPIN_ROUNDS && lock->lock_word <= 0) {
394 if (srv_spin_wait_delay) {
405 if (srv_print_latch_waits) {
407 "Thread %lu spin wait rw-s-lock at %p"
408 " cfile %s cline %lu rnds %lu\n",
412 (ulong) lock->
cline, (ulong) i);
429 lock, RW_LOCK_SHARED,
435 rw_lock_set_waiter_flag(lock);
442 if (srv_print_latch_waits) {
444 "Thread %lu OS wait rw-s-lock at %p"
445 " cfile %s cline %lu\n",
449 (ulong) lock->
cline);
491 #ifdef UNIV_SYNC_DEBUG
495 const char* file_name,
504 if (srv_spin_wait_delay) {
530 #ifdef UNIV_SYNC_DEBUG
531 rw_lock_add_debug_info(lock, pass, RW_LOCK_WAIT_EX,
537 #ifdef UNIV_SYNC_DEBUG
538 rw_lock_remove_debug_info(lock, pass,
561 const char* file_name,
576 pass ? FALSE : TRUE);
578 rw_lock_x_lock_wait(lock,
579 #ifdef UNIV_SYNC_DEBUG
595 #ifdef UNIV_SYNC_DEBUG
596 rw_lock_add_debug_info(lock, pass, RW_LOCK_EX,
621 const char* file_name,
626 ibool spinning = FALSE;
628 ut_ad(rw_lock_validate(lock));
634 if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
649 if (srv_spin_wait_delay) {
651 srv_spin_wait_delay));
665 if (srv_print_latch_waits) {
667 "Thread %lu spin wait rw-x-lock at %p"
668 " cfile %s cline %lu rnds %lu\n",
671 (ulong) lock->
cline, (ulong) i);
682 rw_lock_set_waiter_flag(lock);
684 if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
689 if (srv_print_latch_waits) {
691 "Thread %lu OS wait for rw-x-lock at %p"
692 " cfile %s cline %lu\n",
695 (ulong) lock->
cline);
708 #ifdef UNIV_SYNC_DEBUG
717 rw_lock_debug_mutex_enter(
void)
721 if (0 == mutex_enter_nowait(&rw_lock_debug_mutex)) {
727 rw_lock_debug_waiters = TRUE;
729 if (0 == mutex_enter_nowait(&rw_lock_debug_mutex)) {
733 os_event_wait(rw_lock_debug_event);
742 rw_lock_debug_mutex_exit(
void)
745 mutex_exit(&rw_lock_debug_mutex);
747 if (rw_lock_debug_waiters) {
748 rw_lock_debug_waiters = FALSE;
757 rw_lock_add_debug_info(
762 const char* file_name,
765 rw_lock_debug_t* info;
770 info = rw_lock_debug_create();
772 rw_lock_debug_mutex_enter();
774 info->file_name = file_name;
776 info->lock_type = lock_type;
782 rw_lock_debug_mutex_exit();
784 if ((pass == 0) && (lock_type != RW_LOCK_WAIT_EX)) {
785 sync_thread_add_level(lock, lock->level);
793 rw_lock_remove_debug_info(
799 rw_lock_debug_t* info;
803 if ((pass == 0) && (lock_type != RW_LOCK_WAIT_EX)) {
804 sync_thread_reset_level(lock);
807 rw_lock_debug_mutex_enter();
811 while (info != NULL) {
812 if ((pass == info->pass)
816 && (info->lock_type == lock_type)) {
820 rw_lock_debug_mutex_exit();
822 rw_lock_debug_free(info);
834 #ifdef UNIV_SYNC_DEBUG
847 rw_lock_debug_t* info;
850 ut_ad(rw_lock_validate(lock));
852 rw_lock_debug_mutex_enter();
856 while (info != NULL) {
860 && (info->lock_type == lock_type)) {
862 rw_lock_debug_mutex_exit();
870 rw_lock_debug_mutex_exit();
890 ut_ad(rw_lock_validate(lock));
892 if (lock_type == RW_LOCK_SHARED) {
896 }
else if (lock_type == RW_LOCK_EX) {
907 #ifdef UNIV_SYNC_DEBUG
912 rw_lock_list_print_info(
918 rw_lock_debug_t* info;
920 mutex_enter(&rw_lock_list_mutex);
922 fputs(
"-------------\n"
924 "-------------\n", file);
928 while (lock != NULL) {
932 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
933 mutex_enter(&(lock->
mutex));
937 fprintf(file,
"RW-LOCK: %p ", (
void*) lock);
940 fputs(
" Waiters for the lock exist\n", file);
946 while (info != NULL) {
947 rw_lock_debug_print(file, info);
951 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
952 mutex_exit(&(lock->
mutex));
958 fprintf(file,
"Total number of rw-locks %ld\n", count);
959 mutex_exit(&rw_lock_list_mutex);
970 rw_lock_debug_t* info;
975 "RW-LATCH: %p ", (
void*) lock);
977 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
988 fputs(
" Waiters for the lock exist\n", stderr);
994 while (info != NULL) {
995 rw_lock_debug_print(stderr, info);
1005 rw_lock_debug_print(
1008 rw_lock_debug_t* info)
1012 rwt = info->lock_type;
1014 fprintf(f,
"Locked: thread %lu file %s line %lu ",
1015 (ulong)
os_thread_pf(info->thread_id), info->file_name,
1016 (ulong) info->line);
1017 if (rwt == RW_LOCK_SHARED) {
1019 }
else if (rwt == RW_LOCK_EX) {
1021 }
else if (rwt == RW_LOCK_WAIT_EX) {
1022 fputs(
"WAIT X-LOCK", f);
1026 if (info->pass != 0) {
1027 fprintf(f,
" pass value %lu", (ulong) info->pass);
1038 rw_lock_n_locked(
void)
1044 mutex_enter(&rw_lock_list_mutex);
1048 while (lock != NULL) {
1057 mutex_exit(&rw_lock_list_mutex);