diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2021-02-16 19:23:23 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2021-02-16 19:23:23 +0200 |
commit | 5044ed616598973363af75c1daa6a4378710a589 (patch) | |
tree | 517df103f208812d59e77c885f54a3885ccddfa2 | |
parent | 2a55c8208f42aa5951b9478fe6abaf63d9d5d402 (diff) | |
download | mariadb-git-5044ed616598973363af75c1daa6a4378710a589.tar.gz |
fixup 2ec4b277cc12c005fbe9f308bb8457f055250e97bb-10.6-MDEV-24738
-rw-r--r-- | storage/innobase/sync/srw_lock.cc | 15 |
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); } |