Skip to content
Permalink
Browse files
fix some data races (#464)
* fix some data races
  • Loading branch information
kevgs authored and Sergey Vojtovich committed Oct 11, 2017
1 parent a4c23ac commit 62b21fc
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
@@ -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);

0 comments on commit 62b21fc

Please sign in to comment.