// Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_HEAP_COLLECTION_BARRIER_H_ #define V8_HEAP_COLLECTION_BARRIER_H_ #include <atomic> #include "src/base/optional.h" #include "src/base/platform/condition-variable.h" #include "src/base/platform/elapsed-timer.h" #include "src/base/platform/mutex.h" #include "src/heap/local-heap.h" #include "src/logging/counters.h" namespace v8 { namespace internal { class Heap; // This class stops and resumes all background threads waiting for GC. class CollectionBarrier { public: explicit CollectionBarrier(Heap* heap) : heap_(heap) {} // Returns true when collection was requested. bool WasGCRequested(); // Requests a GC from the main thread. Returns whether GC was successfully // requested. Requesting a GC can fail when isolate shutdown was already // initiated. bool TryRequestGC(); // Resumes all threads waiting for GC when tear down starts. void NotifyShutdownRequested(); // Stops the TimeToCollection timer when starting the GC. void StopTimeToCollectionTimer(); // Resumes threads waiting for collection. void ResumeThreadsAwaitingCollection(); // Cancels collection if one was requested and resumes threads waiting for GC. void CancelCollectionAndResumeThreads(); // This is the method use by background threads to request and wait for GC. // Returns whether a GC was performed. bool AwaitCollectionBackground(LocalHeap* local_heap); private: // Activate stack guards and posting a task to perform the GC. void ActivateStackGuardAndPostTask(); Heap* heap_; base::Mutex mutex_; base::ConditionVariable cv_wakeup_; base::ElapsedTimer timer_; // Flag that main thread checks whether a GC was requested from the background // thread. std::atomic<bool> collection_requested_{false}; // This flag is used to detect whether to block for the GC. Only set if the // main thread was actually running and is unset when GC resumes background // threads. bool block_for_collection_ = false; // Set to true when a GC was performed, false in case it was canceled because // the main thread parked itself without running the GC. bool collection_performed_ = false; // Will be set as soon as Isolate starts tear down. bool shutdown_requested_ = false; }; } // namespace internal } // namespace v8 #endif // V8_HEAP_COLLECTION_BARRIER_H_