168 UNIV_INTERN rw_lock_list_t rw_lock_list;
169 UNIV_INTERN
mutex_t rw_lock_list_mutex;
171 #ifdef UNIV_PFS_MUTEX
172 UNIV_INTERN mysql_pfs_key_t rw_lock_list_mutex_key;
173 UNIV_INTERN mysql_pfs_key_t rw_lock_mutex_key;
176 #ifdef UNIV_SYNC_DEBUG
181 UNIV_INTERN
mutex_t rw_lock_debug_mutex;
183 # ifdef UNIV_PFS_MUTEX
184 UNIV_INTERN mysql_pfs_key_t rw_lock_debug_mutex_key;
191 UNIV_INTERN ibool rw_lock_debug_waiters;
197 rw_lock_debug_create(
void);
205 rw_lock_debug_t* info);
212 rw_lock_debug_create(
void)
215 return((rw_lock_debug_t*) mem_alloc(
sizeof(rw_lock_debug_t)));
224 rw_lock_debug_t* info)
241 # ifdef UNIV_SYNC_DEBUG
244 const char* cmutex_name,
246 const char* cfile_name,
252 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
253 mutex_create(rw_lock_mutex_key, rw_lock_get_mutex(lock),
254 SYNC_NO_ORDER_CHECK);
259 ut_d(lock->
mutex.cmutex_name = cmutex_name);
275 #ifdef UNIV_SYNC_DEBUG
281 ut_d(lock->magic_n = RW_LOCK_MAGIC_N);
284 lock->
cline = (
unsigned int) cline;
294 mutex_enter(&rw_lock_list_mutex);
301 mutex_exit(&rw_lock_list_mutex);
314 ut_ad(rw_lock_validate(lock));
317 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
318 mutex_free(rw_lock_get_mutex(lock));
321 mutex_enter(&rw_lock_list_mutex);
333 mutex_exit(&rw_lock_list_mutex);
335 ut_d(lock->magic_n = 0);
357 ut_ad(lock->magic_n == RW_LOCK_MAGIC_N);
358 ut_a(waiters == 0 || waiters == 1);
359 ut_a(lock_word > -X_LOCK_DECR ||(-lock_word) % X_LOCK_DECR == 0);
377 const char* file_name,
383 ut_ad(rw_lock_validate(lock));
389 while (i < SYNC_SPIN_ROUNDS && lock->lock_word <= 0) {
390 if (srv_spin_wait_delay) {
401 if (srv_print_latch_waits) {
403 "Thread %lu spin wait rw-s-lock at %p"
404 " cfile %s cline %lu rnds %lu\n",
424 lock, RW_LOCK_SHARED,
430 rw_lock_set_waiter_flag(lock);
437 if (srv_print_latch_waits) {
439 "Thread %lu OS wait rw-s-lock at %p"
440 " cfile %s cline %lu\n",
443 (ulong) lock->
cline);
485 #ifdef UNIV_SYNC_DEBUG
489 const char* file_name,
498 if (srv_spin_wait_delay) {
524 #ifdef UNIV_SYNC_DEBUG
525 rw_lock_add_debug_info(lock, pass, RW_LOCK_WAIT_EX,
531 #ifdef UNIV_SYNC_DEBUG
532 rw_lock_remove_debug_info(lock, pass,
555 const char* file_name,
570 pass ? FALSE : TRUE);
572 rw_lock_x_lock_wait(lock,
573 #ifdef UNIV_SYNC_DEBUG
589 #ifdef UNIV_SYNC_DEBUG
590 rw_lock_add_debug_info(lock, pass, RW_LOCK_EX,
615 const char* file_name,
620 ibool spinning = FALSE;
622 ut_ad(rw_lock_validate(lock));
628 if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
643 if (srv_spin_wait_delay) {
645 srv_spin_wait_delay));
659 if (srv_print_latch_waits) {
661 "Thread %lu spin wait rw-x-lock at %p"
662 " cfile %s cline %lu rnds %lu\n",
675 rw_lock_set_waiter_flag(lock);
677 if (rw_lock_x_lock_low(lock, pass, file_name, line)) {
682 if (srv_print_latch_waits) {
684 "Thread %lu OS wait for rw-x-lock at %p"
685 " cfile %s cline %lu\n",
700 #ifdef UNIV_SYNC_DEBUG
709 rw_lock_debug_mutex_enter(
void)
713 if (0 == mutex_enter_nowait(&rw_lock_debug_mutex)) {
719 rw_lock_debug_waiters = TRUE;
721 if (0 == mutex_enter_nowait(&rw_lock_debug_mutex)) {
725 os_event_wait(rw_lock_debug_event);
734 rw_lock_debug_mutex_exit(
void)
737 mutex_exit(&rw_lock_debug_mutex);
739 if (rw_lock_debug_waiters) {
740 rw_lock_debug_waiters = FALSE;
749 rw_lock_add_debug_info(
754 const char* file_name,
757 rw_lock_debug_t* info;
762 info = rw_lock_debug_create();
764 rw_lock_debug_mutex_enter();
766 info->file_name = file_name;
768 info->lock_type = lock_type;
774 rw_lock_debug_mutex_exit();
776 if ((pass == 0) && (lock_type != RW_LOCK_WAIT_EX)) {
777 sync_thread_add_level(lock, lock->level);
785 rw_lock_remove_debug_info(
791 rw_lock_debug_t* info;
795 if ((pass == 0) && (lock_type != RW_LOCK_WAIT_EX)) {
796 sync_thread_reset_level(lock);
799 rw_lock_debug_mutex_enter();
803 while (info != NULL) {
804 if ((pass == info->pass)
808 && (info->lock_type == lock_type)) {
812 rw_lock_debug_mutex_exit();
814 rw_lock_debug_free(info);
826 #ifdef UNIV_SYNC_DEBUG
839 rw_lock_debug_t* info;
842 ut_ad(rw_lock_validate(lock));
844 rw_lock_debug_mutex_enter();
848 while (info != NULL) {
852 && (info->lock_type == lock_type)) {
854 rw_lock_debug_mutex_exit();
862 rw_lock_debug_mutex_exit();
882 ut_ad(rw_lock_validate(lock));
884 if (lock_type == RW_LOCK_SHARED) {
888 }
else if (lock_type == RW_LOCK_EX) {
899 #ifdef UNIV_SYNC_DEBUG
904 rw_lock_list_print_info(
910 rw_lock_debug_t* info;
912 mutex_enter(&rw_lock_list_mutex);
914 fputs(
"-------------\n"
916 "-------------\n", file);
920 while (lock != NULL) {
924 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
925 mutex_enter(&(lock->
mutex));
929 fprintf(file,
"RW-LOCK: %p ", (
void*) lock);
932 fputs(
" Waiters for the lock exist\n", file);
938 while (info != NULL) {
939 rw_lock_debug_print(info);
943 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
944 mutex_exit(&(lock->
mutex));
950 fprintf(file,
"Total number of rw-locks %ld\n", count);
951 mutex_exit(&rw_lock_list_mutex);
962 rw_lock_debug_t* info;
967 "RW-LATCH: %p ", (
void*) lock);
969 #ifndef INNODB_RW_LOCKS_USE_ATOMICS
980 fputs(
" Waiters for the lock exist\n", stderr);
986 while (info != NULL) {
987 rw_lock_debug_print(info);
999 rw_lock_debug_t* info)
1003 rwt = info->lock_type;
1005 fprintf(stderr,
"Locked: thread %lu file %s line %lu ",
1006 (ulong)
os_thread_pf(info->thread_id), info->file_name,
1007 (ulong) info->line);
1008 if (rwt == RW_LOCK_SHARED) {
1009 fputs(
"S-LOCK", stderr);
1010 }
else if (rwt == RW_LOCK_EX) {
1011 fputs(
"X-LOCK", stderr);
1012 }
else if (rwt == RW_LOCK_WAIT_EX) {
1013 fputs(
"WAIT X-LOCK", stderr);
1017 if (info->pass != 0) {
1018 fprintf(stderr,
" pass value %lu", (ulong) info->pass);
1029 rw_lock_n_locked(
void)
1035 mutex_enter(&rw_lock_list_mutex);
1039 while (lock != NULL) {
1048 mutex_exit(&rw_lock_list_mutex);