summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/embedder-tracing.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/embedder-tracing.h')
-rw-r--r--deps/v8/src/heap/embedder-tracing.h78
1 files changed, 51 insertions, 27 deletions
diff --git a/deps/v8/src/heap/embedder-tracing.h b/deps/v8/src/heap/embedder-tracing.h
index 2588200db9..09242042dd 100644
--- a/deps/v8/src/heap/embedder-tracing.h
+++ b/deps/v8/src/heap/embedder-tracing.h
@@ -13,74 +13,98 @@ namespace v8 {
namespace internal {
class Heap;
+class JSObject;
class V8_EXPORT_PRIVATE LocalEmbedderHeapTracer final {
public:
typedef std::pair<void*, void*> WrapperInfo;
+ typedef std::vector<WrapperInfo> WrapperCache;
- explicit LocalEmbedderHeapTracer(Isolate* isolate) : isolate_(isolate) {}
+ class V8_EXPORT_PRIVATE ProcessingScope {
+ public:
+ explicit ProcessingScope(LocalEmbedderHeapTracer* tracer);
+ ~ProcessingScope();
- ~LocalEmbedderHeapTracer() {
- if (remote_tracer_) remote_tracer_->isolate_ = nullptr;
- }
+ void TracePossibleWrapper(JSObject js_object);
- EmbedderHeapTracer* remote_tracer() const { return remote_tracer_; }
+ void AddWrapperInfoForTesting(WrapperInfo info);
- void SetRemoteTracer(EmbedderHeapTracer* tracer) {
- if (remote_tracer_) remote_tracer_->isolate_ = nullptr;
+ private:
+ static constexpr size_t kWrapperCacheSize = 1000;
+
+ void FlushWrapperCacheIfFull();
- remote_tracer_ = tracer;
- if (remote_tracer_)
- remote_tracer_->isolate_ = reinterpret_cast<v8::Isolate*>(isolate_);
+ LocalEmbedderHeapTracer* const tracer_;
+ WrapperCache wrapper_cache_;
+ };
+
+ explicit LocalEmbedderHeapTracer(Isolate* isolate) : isolate_(isolate) {}
+
+ ~LocalEmbedderHeapTracer() {
+ if (remote_tracer_) remote_tracer_->isolate_ = nullptr;
}
bool InUse() const { return remote_tracer_ != nullptr; }
+ EmbedderHeapTracer* remote_tracer() const { return remote_tracer_; }
+ void SetRemoteTracer(EmbedderHeapTracer* tracer);
void TracePrologue();
void TraceEpilogue();
void EnterFinalPause();
bool Trace(double deadline);
bool IsRemoteTracingDone();
- size_t NumberOfCachedWrappersToTrace() {
- return cached_wrappers_to_trace_.size();
- }
- void AddWrapperToTrace(WrapperInfo entry) {
- cached_wrappers_to_trace_.push_back(entry);
- }
- void ClearCachedWrappersToTrace() { cached_wrappers_to_trace_.clear(); }
- void RegisterWrappersWithRemoteTracer();
-
- // In order to avoid running out of memory we force tracing wrappers if there
- // are too many of them.
- bool RequiresImmediateWrapperProcessing();
-
void NotifyV8MarkingWorklistWasEmpty() {
num_v8_marking_worklist_was_empty_++;
}
+
bool ShouldFinalizeIncrementalMarking() {
static const size_t kMaxIncrementalFixpointRounds = 3;
return !FLAG_incremental_marking_wrappers || !InUse() ||
- IsRemoteTracingDone() ||
+ (IsRemoteTracingDone() && embedder_worklist_empty_) ||
num_v8_marking_worklist_was_empty_ > kMaxIncrementalFixpointRounds;
}
void SetEmbedderStackStateForNextFinalization(
EmbedderHeapTracer::EmbedderStackState stack_state);
- private:
- typedef std::vector<WrapperInfo> WrapperCache;
+ void SetEmbedderWorklistEmpty(bool is_empty) {
+ embedder_worklist_empty_ = is_empty;
+ }
+ private:
Isolate* const isolate_;
- WrapperCache cached_wrappers_to_trace_;
EmbedderHeapTracer* remote_tracer_ = nullptr;
+
size_t num_v8_marking_worklist_was_empty_ = 0;
EmbedderHeapTracer::EmbedderStackState embedder_stack_state_ =
EmbedderHeapTracer::kUnknown;
+ // Indicates whether the embedder worklist was observed empty on the main
+ // thread. This is opportunistic as concurrent marking tasks may hold local
+ // segments of potential embedder fields to move to the main thread.
+ bool embedder_worklist_empty_ = false;
friend class EmbedderStackStateScope;
};
+class V8_EXPORT_PRIVATE EmbedderStackStateScope final {
+ public:
+ EmbedderStackStateScope(LocalEmbedderHeapTracer* local_tracer,
+ EmbedderHeapTracer::EmbedderStackState stack_state)
+ : local_tracer_(local_tracer),
+ old_stack_state_(local_tracer_->embedder_stack_state_) {
+ local_tracer_->embedder_stack_state_ = stack_state;
+ }
+
+ ~EmbedderStackStateScope() {
+ local_tracer_->embedder_stack_state_ = old_stack_state_;
+ }
+
+ private:
+ LocalEmbedderHeapTracer* const local_tracer_;
+ const EmbedderHeapTracer::EmbedderStackState old_stack_state_;
+};
+
} // namespace internal
} // namespace v8