summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2021-02-16 19:23:23 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2021-02-16 19:23:23 +0200
commit5044ed616598973363af75c1daa6a4378710a589 (patch)
tree517df103f208812d59e77c885f54a3885ccddfa2
parent2a55c8208f42aa5951b9478fe6abaf63d9d5d402 (diff)
downloadmariadb-git-bb-10.6-MDEV-24738.tar.gz
fixup 2ec4b277cc12c005fbe9f308bb8457f055250e97bb-10.6-MDEV-24738
-rw-r--r--storage/innobase/sync/srw_lock.cc15
1 files changed, 10 insertions, 5 deletions
diff --git a/storage/innobase/sync/srw_lock.cc b/storage/innobase/sync/srw_lock.cc
index 3efdb05f3f7..223acac665f 100644
--- a/storage/innobase/sync/srw_lock.cc
+++ b/storage/innobase/sync/srw_lock.cc
@@ -204,11 +204,12 @@ void ssux_lock_low::write_lock(bool holding_u)
ut_delay(srv_spin_wait_delay);
}
- l= holding_u ? WRITER_WAITING | UPDATER : WRITER_WAITING;
+ const uint32_t e= holding_u ? WRITER_WAITING | UPDATER : WRITER_WAITING;
+ l= e;
if (write_lock_wait_try(l))
return;
- while (!(l & WRITER_WAITING))
+ if (!(l & WRITER_WAITING))
{
switch (l) {
case UNLOCKED:
@@ -220,10 +221,14 @@ void ssux_lock_low::write_lock(bool holding_u)
if (holding_u && upgrade_trylock())
return;
}
- l= write_lock_wait_start() | WRITER_WAITING;
- }
- DBUG_ASSERT(~WRITER_WAITING & l);
+ for (l= write_lock_wait_start() | WRITER_WAITING;
+ (l | WRITER_WAITING) == e; )
+ if (write_lock_wait_try(l))
+ return;
+ }
+ else
+ DBUG_ASSERT(~WRITER_WAITING & l);
writer_wait(l);
}