diff --git a/storage/innobase/include/sync0rw.ic b/storage/innobase/include/sync0rw.ic index 21d12b744a9..4efc8dc70fe 100644 --- a/storage/innobase/include/sync0rw.ic +++ b/storage/innobase/include/sync0rw.ic @@ -356,9 +356,13 @@ rw_lock_s_unlock_func( #endif /* UNIV_DEBUG */ rw_lock_t* lock) /*!< in/out: rw-lock */ { - ut_ad(lock->lock_word > -X_LOCK_DECR); - ut_ad(lock->lock_word != 0); - ut_ad(lock->lock_word < X_LOCK_DECR); +#ifdef UNIV_DEBUG + lint dbg_lock_word = my_atomic_loadlint_explicit( + &lock->lock_word, MY_MEMORY_ORDER_RELAXED); + ut_ad(dbg_lock_word > -X_LOCK_DECR); + ut_ad(dbg_lock_word != 0); + ut_ad(dbg_lock_word < X_LOCK_DECR); +#endif ut_d(rw_lock_remove_debug_info(lock, pass, RW_LOCK_S)); @@ -411,7 +415,8 @@ rw_lock_x_unlock_func( We need to signal read/write waiters. We do not need to signal wait_ex waiters, since they cannot exist when there is a writer. */ - if (lock->waiters) { + if (my_atomic_load32_explicit(&lock->waiters, + MY_MEMORY_ORDER_RELAXED)) { my_atomic_store32((int32*) &lock->waiters, 0); os_event_set(lock->event); sync_array_object_signalled(); diff --git a/storage/innobase/sync/sync0rw.cc b/storage/innobase/sync/sync0rw.cc index 6322b14335f..959fd7f2b78 100644 --- a/storage/innobase/sync/sync0rw.cc +++ b/storage/innobase/sync/sync0rw.cc @@ -880,10 +880,12 @@ rw_lock_validate( ut_ad(lock); - lock_word = lock->lock_word; + lock_word = my_atomic_loadlint_explicit(&lock->lock_word, + MY_MEMORY_ORDER_RELAXED); ut_ad(lock->magic_n == RW_LOCK_MAGIC_N); - ut_ad(lock->waiters < 2); + ut_ad(my_atomic_load32_explicit(&lock->waiters, + MY_MEMORY_ORDER_RELAXED) < 2); ut_ad(lock_word > -(2 * X_LOCK_DECR)); ut_ad(lock_word <= X_LOCK_DECR);