162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// found in the LICENSE file.
462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifndef V8_HEAP_EMBEDDER_TRACING_H_
662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define V8_HEAP_EMBEDDER_TRACING_H_
762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "include/v8.h"
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/flags.h"
1062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/globals.h"
1162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace v8 {
1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace internal {
1462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Heap;
1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass V8_EXPORT_PRIVATE LocalEmbedderHeapTracer final {
1862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
1962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef std::pair<void*, void*> WrapperInfo;
2062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  LocalEmbedderHeapTracer()
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : remote_tracer_(nullptr), num_v8_marking_deque_was_empty_(0) {}
2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void SetRemoteTracer(EmbedderHeapTracer* tracer) { remote_tracer_ = tracer; }
2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool InUse() { return remote_tracer_ != nullptr; }
2662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
2762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void TracePrologue();
2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void TraceEpilogue();
2962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void AbortTracing();
3062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void EnterFinalPause();
3162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool Trace(double deadline,
3262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch             EmbedderHeapTracer::AdvanceTracingActions actions);
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  size_t NumberOfWrappersToTrace();
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  size_t NumberOfCachedWrappersToTrace() {
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return cached_wrappers_to_trace_.size();
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void AddWrapperToTrace(WrapperInfo entry) {
3962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    cached_wrappers_to_trace_.push_back(entry);
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void ClearCachedWrappersToTrace() { cached_wrappers_to_trace_.clear(); }
4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void RegisterWrappersWithRemoteTracer();
4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // In order to avoid running out of memory we force tracing wrappers if there
4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // are too many of them.
4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool RequiresImmediateWrapperProcessing();
4762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void NotifyV8MarkingDequeWasEmpty() { num_v8_marking_deque_was_empty_++; }
4962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool ShouldFinalizeIncrementalMarking() {
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    static const size_t kMaxIncrementalFixpointRounds = 3;
5162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return !FLAG_incremental_marking_wrappers || !InUse() ||
5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch           NumberOfWrappersToTrace() == 0 ||
5362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch           num_v8_marking_deque_was_empty_ > kMaxIncrementalFixpointRounds;
5462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
5562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private:
5762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  typedef std::vector<WrapperInfo> WrapperCache;
5862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  EmbedderHeapTracer* remote_tracer_;
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WrapperCache cached_wrappers_to_trace_;
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  size_t num_v8_marking_deque_was_empty_;
6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace internal
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}  // namespace v8
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
6762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif  // V8_HEAP_EMBEDDER_TRACING_H_
68