diff options
author | Sergey Vojtovich <svoj@mariadb.org> | 2017-11-24 11:47:50 +0400 |
---|---|---|
committer | Sergey Vojtovich <svoj@mariadb.org> | 2017-11-30 13:33:12 +0400 |
commit | 623eb87b3cf3233c5c269d6cf3c5233e7eaf6a41 (patch) | |
tree | f2f785135dda19991e18ac3cd0fb8d3723599f84 | |
parent | 7cb3520c0632ad912b309489ad86a90f9fc9bd0b (diff) | |
download | mariadb-git-10.3-svoj-for-wlad.tar.gz |
Optimized event mutex10.3-svoj-for-wlad
-rw-r--r-- | storage/innobase/include/ib0mutex.h | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/storage/innobase/include/ib0mutex.h b/storage/innobase/include/ib0mutex.h index 76f02cc1521..325e4680f65 100644 --- a/storage/innobase/include/ib0mutex.h +++ b/storage/innobase/include/ib0mutex.h @@ -33,6 +33,7 @@ Created 2013-03-26 Sunny Bains. #include "ut0rnd.h" #include "os0event.h" #include "sync0arr.h" +#include "my_cpu.h" /** OS mutex for tracking lock/unlock for debugging */ template <template <typename> class Policy = NoPolicy> @@ -490,34 +491,42 @@ struct TTASEventMutex { const uint32_t step = max_spins; while (!try_lock()) { - if (n_spins++ == max_spins) { - max_spins += step; - n_waits++; - os_thread_yield(); - - sync_cell_t* cell; - sync_array_t *sync_arr = sync_array_get_and_reserve_cell( - this, - (m_policy.get_id() == LATCH_ID_BUF_BLOCK_MUTEX - || m_policy.get_id() == LATCH_ID_BUF_POOL_ZIP) - ? SYNC_BUF_BLOCK - : SYNC_MUTEX, - filename, line, &cell); - - int32 oldval = MUTEX_STATE_LOCKED; - my_atomic_cas32_strong_explicit(&m_lock_word, &oldval, - MUTEX_STATE_WAITERS, - MY_MEMORY_ORDER_RELAXED, - MY_MEMORY_ORDER_RELAXED); - - if (oldval == MUTEX_STATE_UNLOCKED) { - sync_array_free_cell(sync_arr, cell); - } else { - sync_array_wait_event(sync_arr, cell); + uint32_t delay = 0; + + HMT_low(); + while (my_atomic_load32_explicit(&m_lock_word, MY_MEMORY_ORDER_RELAXED) != MUTEX_STATE_UNLOCKED) { + UT_RELAX_CPU(); + if (delay++ == max_delay * 500) { + delay = 0; + if (n_spins++ == max_spins) { + max_spins += step; + n_waits++; + os_thread_yield(); + + sync_cell_t* cell; + sync_array_t *sync_arr = sync_array_get_and_reserve_cell( + this, + (m_policy.get_id() == LATCH_ID_BUF_BLOCK_MUTEX + || m_policy.get_id() == LATCH_ID_BUF_POOL_ZIP) + ? SYNC_BUF_BLOCK + : SYNC_MUTEX, + filename, line, &cell); + + int32 oldval = MUTEX_STATE_LOCKED; + my_atomic_cas32_strong_explicit(&m_lock_word, &oldval, + MUTEX_STATE_WAITERS, + MY_MEMORY_ORDER_RELAXED, + MY_MEMORY_ORDER_RELAXED); + + if (oldval == MUTEX_STATE_UNLOCKED) { + sync_array_free_cell(sync_arr, cell); + } else { + sync_array_wait_event(sync_arr, cell); + } + } } - } else { - ut_delay(ut_rnd_interval(0, max_delay)); } + HMT_medium(); } m_policy.add(n_spins, n_waits); |