Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Unified Diff: include/v8.h

Issue 1815153002: Introduce EmbedderHeapTracer (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Incorporated wonderful Hannes' comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/api.cc » ('j') | src/heap/heap.h » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index db2178b73becb2c7ad76a5f28e8b81e4c14d1c33..944920dd3376253d1894fb869571787128748aeb 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -18,6 +18,8 @@
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
+#include <utility>
+#include <vector>
#include "v8-version.h" // NOLINT(build/include)
#include "v8config.h" // NOLINT(build/include)
@@ -594,6 +596,13 @@ template <class T> class PersistentBase {
V8_INLINE void ClearWeak() { ClearWeak<void>(); }
/**
+ * Allows the embedder to tell the v8 garbage collector that a certain object
+ * is alive. Only allowed when the embedder is asked to trace its heap by
+ * EmbedderHeapTracer.
+ */
+ V8_INLINE void RegisterExternalReference(Isolate* isolate);
Hannes Payer (out of office) 2016/03/31 12:31:38 RegisterExternallyReferencedObject
+
+ /**
* Marks the reference to this object independent. Garbage collector is free
* to ignore any object groups containing this object. Weak callback for an
* independent handle should not assume that it will be preceded by a global
@@ -5361,6 +5370,43 @@ class V8_EXPORT PersistentHandleVisitor { // NOLINT
enum class MemoryPressureLevel { kNone, kModerate, kCritical };
/**
+ * Interface for tracing through the embedder heap. During the v8 garbage
+ * collection, v8 collects hidden fields of all potential wrappers, and at the
+ * end of its marking phase iterates the collection and asks the embedder to
+ * trace through its heap and call PersistentBase::RegisterExternalReference on
+ * each js object reachable from any of the given wrappers.
+ *
+ * Before the first call to the TraceWrappableFrom function v8 will call
+ * TraceRoots. When the v8 garbage collection is finished, v8 will call
+ * ClearTracingMarks.
+ */
+class EmbedderHeapTracer {
+ public:
+ /**
+ * V8 will call this method at the beginning of the gc cycle.
+ */
+ virtual void TraceRoots(Isolate* isolate) = 0;
+
+ /**
+ * V8 will call this method with internal fields of a potential wrappers.
+ * Embedder is expected to trace its heap (synchronously) and call
+ * PersistentBase::RegisterExternalReference() on all wrappers reachable from
+ * any of the given wrappers.
+ */
+ virtual void TraceWrappableFrom(
+ Isolate* isolate,
+ const std::vector<std::pair<void*, void*> >& internal_fields) = 0;
+ /**
+ * V8 will call this method at the end of the gc cycle. Allocation is *not*
+ * allowed in the ClearTracingMarks.
+ */
+ virtual void ClearTracingMarks(Isolate* isolate) = 0;
+
+ protected:
+ virtual ~EmbedderHeapTracer() = default;
+};
+
+/**
* Isolate represents an isolated instance of the V8 engine. V8 isolates have
* completely separate states. Objects from one isolate must not be used in
* other isolates. The embedder can create multiple isolates and use them in
@@ -5829,6 +5875,11 @@ class V8_EXPORT Isolate {
void RemoveGCPrologueCallback(GCCallback callback);
/**
+ * Sets the embedder heap tracer for the isolate.
+ */
+ void SetEmbedderHeapTracer(EmbedderHeapTracer* tracer);
+
+ /**
* Enables the host application to receive a notification after a
* garbage collection. Allocations are allowed in the callback function,
* but the callback is not re-entrant: if the allocation inside it will
@@ -6585,6 +6636,8 @@ class V8_EXPORT V8 {
static internal::Object** CopyPersistent(internal::Object** handle);
static void DisposeGlobal(internal::Object** global_handle);
typedef WeakCallbackData<Value, void>::Callback WeakCallback;
+ static void RegisterExternallyReferencedObject(internal::Object** object,
+ internal::Isolate* isolate);
static void MakeWeak(internal::Object** global_handle, void* data,
WeakCallback weak_callback);
static void MakeWeak(internal::Object** global_handle, void* data,
@@ -7602,6 +7655,13 @@ P* PersistentBase<T>::ClearWeak() {
V8::ClearWeak(reinterpret_cast<internal::Object**>(this->val_)));
}
+template <class T>
+void PersistentBase<T>::RegisterExternalReference(Isolate* isolate) {
+ if (IsEmpty()) return;
+ V8::RegisterExternallyReferencedObject(
+ reinterpret_cast<internal::Object**>(this->val_),
+ reinterpret_cast<internal::Isolate*>(isolate));
+}
template <class T>
void PersistentBase<T>::MarkIndependent() {
« no previous file with comments | « no previous file | src/api.cc » ('j') | src/heap/heap.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698