From 26802a469ca457b56b7bc34b1cc1d1b1adc04409 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 7 Jul 2022 15:05:34 +0100 Subject: [PATCH 3/3] std::atomic + packed Change-Id: Icde7883d8528fe3aa755a5d3f129fba08cc15dde --- gdb/dwarf2/read.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index f98d8b27649..7a33067d601 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -180,7 +180,7 @@ struct dwarf2_per_cu_data packed m_unit_type = (dwarf_unit_type) 0; /* The language of this CU. */ - packed m_lang = language_unknown; + std::atomic> m_lang {language_unknown}; public: /* True if this CU has been scanned by the indexer; false if @@ -327,16 +327,18 @@ struct dwarf2_per_cu_data enum language lang () const { gdb_assert (m_lang != language_unknown); - return m_lang; + return m_lang.load (); } void set_lang (enum language lang) { - /* We'd like to be more strict here, similar to what is done in - set_unit_type, but currently a partial unit can go from unknown to - minimal to ada to c. */ - if (m_lang != lang) - m_lang = lang; + packed nope = language_unknown; + if (m_lang.compare_exchange_strong (nope, lang)) + return; + nope = lang; + if (m_lang.compare_exchange_strong (nope, lang)) + return; + gdb_assert_not_reached (); } /* Free any cached file names. */ -- 2.36.0