summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-03-25 09:23:16 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2022-03-25 09:23:16 +0200
commite9e6db93550aee9e6567b94ab928da9b13050e98 (patch)
tree5a3896b5c97cf211f0e6ec64836df15b2d8d0b4c
parent63f76d3b98ea5bc829c0bc08830ec3a9267915c4 (diff)
downloadmariadb-git-e9e6db93550aee9e6567b94ab928da9b13050e98.tar.gz
Fix g++-12 -O2 -Wstringop-overflow
buf_pool_t::watch_unset(): Reorder some code so that no warning will be emitted in CMAKE_BUILD_TYPE=RelWithDebInfo. It is unclear why invoking watch_is_sentinel() before accessing the block descriptor state would make the warning disappear.
-rw-r--r--storage/innobase/buf/buf0buf.cc16
1 files changed, 10 insertions, 6 deletions
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
index 3f4f7888315..24eef21d461 100644
--- a/storage/innobase/buf/buf0buf.cc
+++ b/storage/innobase/buf/buf0buf.cc
@@ -2160,17 +2160,21 @@ void buf_pool_t::watch_unset(const page_id_t id, buf_pool_t::hash_chain &chain)
buf_page_t *w;
{
transactional_lock_guard<page_hash_latch> g{page_hash.lock_get(chain)};
- /* The page must exist because watch_set() increments buf_fix_count. */
+ /* The page must exist because watch_set() did fix(). */
w= page_hash.get(id, chain);
- const auto state= w->state();
- ut_ad(state >= buf_page_t::UNFIXED);
- ut_ad(~buf_page_t::LRU_MASK & state);
ut_ad(w->in_page_hash);
- if (state != buf_page_t::UNFIXED + 1 || !watch_is_sentinel(*w))
+ if (!watch_is_sentinel(*w))
{
- w->unfix();
+ no_watch:
+ ut_d(const auto s=) w->unfix();
+ ut_ad(~buf_page_t::LRU_MASK & s);
w= nullptr;
}
+ const auto state= w->state();
+ ut_ad(~buf_page_t::LRU_MASK & state);
+ ut_ad(state >= buf_page_t::UNFIXED);
+ if (state != buf_page_t::UNFIXED + 1)
+ goto no_watch;
}
if (!w)