From d93ecad4b7bdb6a7e38fdb5676b66fb530499642 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Wed, 23 Nov 2022 17:38:05 +0000 Subject: [PATCH] Bug 1800263 - Part 1: Tidup, make MarkingState a private enum inside GCMarker r=sfink Differential Revision: https://phabricator.services.mozilla.com/D162393 --- js/src/gc/GCMarker.h | 54 +++++++++++++++++++++++++-------------------------- js/src/gc/Marking.cpp | 25 ++++++++++++------------ 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/js/src/gc/GCMarker.h b/js/src/gc/GCMarker.h index 63d6062eada9..8273aa61c29f 100644 --- a/js/src/gc/GCMarker.h +++ b/js/src/gc/GCMarker.h @@ -202,27 +202,29 @@ class MarkStack { } /* namespace gc */ -enum MarkingState : uint8_t { - // Have not yet started marking. - NotActive, - - // Main marking mode. Weakmap marking will be populating the gcEphemeronEdges - // tables but not consulting them. The state will transition to WeakMarking - // until it is done, then back to RegularMarking. - RegularMarking, - - // Same as RegularMarking except now every marked obj/script is immediately - // looked up in the gcEphemeronEdges table to find edges generated by weakmap - // keys, and traversing them to their values. Transitions back to - // RegularMarking when done. - WeakMarking, - - // Same as RegularMarking, but we OOMed (or obeyed a directive in the test - // marking queue) and fell back to iterating until the next GC. - IterativeMarking -}; - class GCMarker final : public GenericTracerImpl { + enum MarkingState : uint8_t { + // Have not yet started marking. + NotActive, + + // Main marking mode. Weakmap marking will be populating the + // gcEphemeronEdges + // tables but not consulting them. The state will transition to WeakMarking + // until it is done, then back to RegularMarking. + RegularMarking, + + // Same as RegularMarking except now every marked obj/script is immediately + // looked up in the gcEphemeronEdges table to find edges generated by + // weakmap + // keys, and traversing them to their values. Transitions back to + // RegularMarking when done. + WeakMarking, + + // Same as RegularMarking, but we OOMed (or obeyed a directive in the test + // marking queue) and fell back to iterating until the next GC. + IterativeMarking + }; + public: explicit GCMarker(JSRuntime* rt); [[nodiscard]] bool init(); @@ -231,7 +233,7 @@ class GCMarker final : public GenericTracerImpl { void setMaxCapacity(size_t maxCap) { stack.setMaxCapacity(maxCap); } #endif - bool isActive() const { return state != MarkingState::NotActive; } + bool isActive() const { return state != NotActive; } void start(); void stop(); @@ -294,10 +296,10 @@ class GCMarker final : public GenericTracerImpl { // Currently, this will only be triggered by an OOM when updating needed data // structures. void abortLinearWeakMarking() { - if (state == MarkingState::WeakMarking) { + if (state == WeakMarking) { leaveWeakMarkingMode(); } - state = MarkingState::IterativeMarking; + state = IterativeMarking; } void delayMarkingChildrenOnOOM(gc::Cell* cell); @@ -338,10 +340,8 @@ class GCMarker final : public GenericTracerImpl { template void markImplicitEdges(T* oldThing); - bool isRegularMarking() const { - return state == MarkingState::RegularMarking; - } - bool isWeakMarking() const { return state == MarkingState::WeakMarking; } + bool isRegularMarking() const { return state == RegularMarking; } + bool isWeakMarking() const { return state == WeakMarking; } bool isMarkStackEmpty() { return stack.isEmpty(); } diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index c191c1571281..376b15a3cc1d 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -1761,7 +1761,7 @@ GCMarker::GCMarker(JSRuntime* rt) markColor_(MarkColor::Black), delayedMarkingList(nullptr), delayedMarkingWorkAdded(false), - state(MarkingState::NotActive), + state(NotActive), incrementalWeakMapMarkingEnabled( TuningDefaults::IncrementalWeakMapMarkingEnabled) #ifdef DEBUG @@ -1778,8 +1778,8 @@ bool GCMarker::init() { return stack.init(); } bool GCMarker::isDrained() { return isMarkStackEmpty() && !delayedMarkingList; } void GCMarker::start() { - MOZ_ASSERT(state == MarkingState::NotActive); - state = MarkingState::RegularMarking; + MOZ_ASSERT(state == NotActive); + state = RegularMarking; markColor_ = MarkColor::Black; MOZ_ASSERT(!delayedMarkingList); @@ -1803,10 +1803,10 @@ void GCMarker::stop() { MOZ_ASSERT(!delayedMarkingList); MOZ_ASSERT(markLaterArenas == 0); - if (state == MarkingState::NotActive) { + if (state == NotActive) { return; } - state = MarkingState::NotActive; + state = NotActive; stack.clear(); ClearEphemeronEdges(runtime()); @@ -1894,8 +1894,8 @@ void GCMarker::repush(JSObject* obj) { bool GCMarker::enterWeakMarkingMode() { MOZ_ASSERT(weakMapAction() == JS::WeakMapTraceAction::Expand); - MOZ_ASSERT(state != MarkingState::WeakMarking); - if (state == MarkingState::IterativeMarking) { + MOZ_ASSERT(state != WeakMarking); + if (state == IterativeMarking) { return false; } @@ -1909,7 +1909,7 @@ bool GCMarker::enterWeakMarkingMode() { // Set state before doing anything else, so any new key that is marked // during the following gcEphemeronEdges scan will itself be looked up in // gcEphemeronEdges and marked according to ephemeron rules. - state = MarkingState::WeakMarking; + state = WeakMarking; return true; } @@ -1965,11 +1965,10 @@ IncrementalProgress JS::Zone::enterWeakMarkingMode(GCMarker* marker, } void GCMarker::leaveWeakMarkingMode() { - MOZ_ASSERT(state == MarkingState::WeakMarking || - state == MarkingState::IterativeMarking); + MOZ_ASSERT(state == WeakMarking || state == IterativeMarking); - if (state != MarkingState::IterativeMarking) { - state = MarkingState::RegularMarking; + if (state != IterativeMarking) { + state = RegularMarking; } // The gcEphemeronEdges table is still populated and may be used during a @@ -2098,7 +2097,7 @@ inline void GCMarker::appendToDelayedMarkingList(Arena** listTail, #ifdef DEBUG void GCMarker::checkZone(void* p) { - MOZ_ASSERT(state != MarkingState::NotActive); + MOZ_ASSERT(state != NotActive); DebugOnly cell = static_cast(p); MOZ_ASSERT_IF(cell->isTenured(), cell->asTenured().zone()->isCollectingFromAnyThread()); -- 2.11.4.GIT