summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-09-28 08:48:22 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2021-09-28 09:04:58 +0300
commit91e22d8bd955ae76f5a2374b466bc195edf8822b (patch)
tree30685431a8be4ff03d1bcb8e4da788ef393f389c
parentdeac083662cdcf51df6abc7acfdd1a2ba64b64a4 (diff)
downloadmariadb-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.h2
-rw-r--r--storage/innobase/sync/srw_lock.cc16
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);