Commit 62b21fc1 authored by Eugene Kosov's avatar Eugene Kosov Committed by Sergey Vojtovich

fix some data races (#464)

* fix some data races
parent a4c23ac7
......@@ -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();
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment