diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-28 08:48:22 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-09-28 09:04:58 +0300 |
commit | 91e22d8bd955ae76f5a2374b466bc195edf8822b (patch) | |
tree | 30685431a8be4ff03d1bcb8e4da788ef393f389c | |
parent | deac083662cdcf51df6abc7acfdd1a2ba64b64a4 (diff) | |
download | mariadb-git-bb-10.6-MDEV-26467-2.tar.gz |
MDEV-26467: Actually use spinloop on block_lockbb-10.6-MDEV-26467-2
-rw-r--r-- | storage/innobase/include/srw_lock.h | 2 | ||||
-rw-r--r-- | storage/innobase/sync/srw_lock.cc | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/storage/innobase/include/srw_lock.h b/storage/innobase/include/srw_lock.h index 308f3c0a68e..3d0d82b81df 100644 --- a/storage/innobase/include/srw_lock.h +++ b/storage/innobase/include/srw_lock.h @@ -151,7 +151,7 @@ public: void wr_unlock(); #else /** mutex for synchronization; held by U or X lock holders */ - srw_mutex writer; + srw_mutex_impl<spinloop> writer; /** S or U holders, and WRITER flag for X holder or waiter */ std::atomic<uint32_t> readers; /** indicates an X request; readers=WRITER indicates granted X lock */ diff --git a/storage/innobase/sync/srw_lock.cc b/storage/innobase/sync/srw_lock.cc index 3f1a56f2e6b..d8ab4b70b4d 100644 --- a/storage/innobase/sync/srw_lock.cc +++ b/storage/innobase/sync/srw_lock.cc @@ -383,7 +383,23 @@ void ssux_lock_impl<spinloop>::wr_wait(uint32_t lk) DBUG_ASSERT(writer.is_locked()); DBUG_ASSERT(lk); DBUG_ASSERT(lk < WRITER); + + if (spinloop) + { + const unsigned delay= srw_pause_delay(); + + for (auto spin= srv_n_spin_wait_rounds; spin; spin--) + { + srw_pause(delay); + lk= readers.load(std::memory_order_acquire); + if (lk == WRITER) + return; + DBUG_ASSERT(lk > WRITER); + } + } + lk|= WRITER; + do { DBUG_ASSERT(lk > WRITER); |