From d400a3cf478953faa90207b60112ead06b16bcb2 Mon Sep 17 00:00:00 2001 From: Vadim Sadokhov Date: Fri, 1 Dec 2023 12:03:07 +0300 Subject: [PATCH] change memory order --- compiler/pipes/final-check.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/compiler/pipes/final-check.cpp b/compiler/pipes/final-check.cpp index d00f18dedb..fe8ec17f97 100644 --- a/compiler/pipes/final-check.cpp +++ b/compiler/pipes/final-check.cpp @@ -46,7 +46,7 @@ std::vector find_not_ic_compatibility_derivatives(ClassPtr klass); void check_fields_ic_compatibility(ClassPtr klass) { bool flag = false; - if (!klass->process_fields_ic_compatibility.compare_exchange_strong(flag, true)) { + if (!klass->process_fields_ic_compatibility.compare_exchange_strong(flag, true, std::memory_order_acq_rel)) { return; } klass->members.for_each([klass](const ClassMemberInstanceField &field) { @@ -65,7 +65,7 @@ void check_fields_ic_compatibility(ClassPtr klass) { } } }); - klass->process_fields_ic_compatibility.store(false); + klass->process_fields_ic_compatibility.store(false, std::memory_order_release); } void check_derivatives_ic_compatibility(ClassPtr klass) { @@ -83,9 +83,9 @@ std::vector find_not_ic_compatibility_derivatives(ClassPtr klass) { ClassPtr current = stack.back(); stack.pop_back(); for (const auto & derived : current->derived_classes) { - if (derived->is_subtree_immutable.load() == SubtreeImmutableType::immutable) { + if (derived->is_subtree_immutable.load(std::memory_order_acquire) == SubtreeImmutableType::immutable) { // continue - } else if (derived->is_subtree_immutable.load() == SubtreeImmutableType::not_immutable) { + } else if (derived->is_subtree_immutable.load(std::memory_order_acquire) == SubtreeImmutableType::not_immutable) { has_mutable_subtree = true; } else if (!derived->is_immutable && !derived->is_interface()) { mutable_children.push_back(derived); @@ -96,7 +96,8 @@ std::vector find_not_ic_compatibility_derivatives(ClassPtr klass) { } } klass->is_subtree_immutable.store(has_mutable_subtree || !mutable_children.empty() - ? SubtreeImmutableType::not_immutable : SubtreeImmutableType::immutable); + ? SubtreeImmutableType::not_immutable : SubtreeImmutableType::immutable, + std::memory_order_release); return mutable_children; }