From 798e832943f5b2fd0dcba29e0b0ffb71e0a9fe53 Mon Sep 17 00:00:00 2001 From: Alexander Shabalin Date: Wed, 6 Sep 2023 13:44:24 +0200 Subject: [PATCH] [K/N] Remove fast paths phase checks in parallel mark ^KT-61741 --- .../runtime/src/gc/cms/cpp/ParallelMark.cpp | 14 +++++++------- .../runtime/src/gc/cms/cpp/ParallelMark.hpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.cpp b/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.cpp index be585d74f79..9133f1ed808 100644 --- a/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.cpp +++ b/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.cpp @@ -22,19 +22,19 @@ void spinWait(Cond&& until) { } // namespace bool gc::mark::MarkPacer::is(gc::mark::MarkPacer::Phase phase) const { - return phase_.load(std::memory_order_relaxed) == phase; + std::unique_lock lock(mutex_); + return phase_ == phase; } void gc::mark::MarkPacer::begin(gc::mark::MarkPacer::Phase phase) { { std::unique_lock lock(mutex_); - phase_.store(phase, std::memory_order_relaxed); + phase_ = phase; } cond_.notify_all(); } void gc::mark::MarkPacer::wait(gc::mark::MarkPacer::Phase phase) { - if (phase_.load(std::memory_order_relaxed) >= phase) return; std::unique_lock lock(mutex_); cond_.wait(lock, [=]() { return phase_ >= phase; }); } @@ -47,17 +47,18 @@ void gc::mark::MarkPacer::beginEpoch(uint64_t epoch) { void gc::mark::MarkPacer::waitNewEpochReadyOrShutdown() const { std::unique_lock lock(mutex_); - cond_.wait(lock, [this]() { return (phase_.load(std::memory_order_relaxed) >= Phase::kReady); }); + cond_.wait(lock, [this]() { return phase_ >= Phase::kReady; }); } void gc::mark::MarkPacer::waitEpochFinished(uint64_t currentEpoch) const { std::unique_lock lock(mutex_); cond_.wait(lock, [this, currentEpoch]() { - return is(Phase::kIdle) || is(Phase::kShutdown) || epoch_.load(std::memory_order_relaxed) > currentEpoch; + return phase_ == Phase::kIdle || phase_ == Phase::kShutdown || epoch_.load(std::memory_order_relaxed) > currentEpoch; }); } bool gc::mark::MarkPacer::acceptingNewWorkers() const { + std::unique_lock lock(mutex_); return Phase::kReady <= phase_ && phase_ <= Phase::kParallelMark; } @@ -127,10 +128,9 @@ void gc::mark::ParallelMark::runMainInSTW() { void gc::mark::ParallelMark::runOnMutator(mm::ThreadData& mutatorThread) { if (compiler::gcMarkSingleThreaded() || !mutatorsCooperate_) return; - auto epoch = gcHandle().getEpoch(); auto parallelWorker = createWorker(); if (parallelWorker) { - GCLogDebug(epoch, "Mutator thread cooperates in marking"); + GCLogDebug(gcHandle().getEpoch(), "Mutator thread cooperates in marking"); tryCollectRootSet(mutatorThread, *parallelWorker); diff --git a/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.hpp b/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.hpp index a2310a18a5c..30551c34ef9 100644 --- a/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.hpp +++ b/kotlin-native/runtime/src/gc/cms/cpp/ParallelMark.hpp @@ -56,7 +56,7 @@ public: private: std::atomic epoch_ = 0; - std::atomic phase_ = Phase::kIdle; + Phase phase_ = Phase::kIdle; mutable std::mutex mutex_; mutable std::condition_variable cond_; };