summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2017-11-24 11:47:50 +0400
committerSergey Vojtovich <svoj@mariadb.org>2017-11-30 13:33:12 +0400
commit623eb87b3cf3233c5c269d6cf3c5233e7eaf6a41 (patch)
treef2f785135dda19991e18ac3cd0fb8d3723599f84
parent7cb3520c0632ad912b309489ad86a90f9fc9bd0b (diff)
downloadmariadb-git-10.3-svoj-for-wlad.tar.gz
Optimized event mutex10.3-svoj-for-wlad
-rw-r--r--storage/innobase/include/ib0mutex.h61
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);