aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/heap
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-09-08 15:36:50 +0200
committerMichaël Zasso <targos@protonmail.com>2017-10-18 17:04:41 -0700
commitd7456ab2ebb3d4c45deb09420271f0da437685f8 (patch)
treeac380c89bbce966b75a69c61b9541de26f0df999 /deps/v8/src/heap
parent2780f01392a43a0714d7f5c871eb73c04f4551e8 (diff)
downloadandroid-node-v8-d7456ab2ebb3d4c45deb09420271f0da437685f8.tar.gz
android-node-v8-d7456ab2ebb3d4c45deb09420271f0da437685f8.tar.bz2
android-node-v8-d7456ab2ebb3d4c45deb09420271f0da437685f8.zip
deps: cherry-pick 9b21865822243 from V8 upstream
Original commit message: [api] Add optional data pointer to GC callbacks This can be useful when there may be multiple callbacks attached by code that's not directly tied to a single isolate, e.g. working on a per-context basis. This also allows rephrasing the global non-isolate APIs in terms of this new API, rather than working around it inside `src/heap`. TBR=hpayer@chromium.org Bug: Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_rel_ng Change-Id: I2e490ec40d1a34ea812f25f41ef9741d2116d965 Reviewed-on: https://chromium-review.googlesource.com/647548 Reviewed-by: Yang Guo <yangguo@chromium.org> Reviewed-by: Adam Klein <adamk@chromium.org> Commit-Queue: Yang Guo <yangguo@chromium.org> Cr-Commit-Position: refs/heads/master@{#47923} PR-URL: https://github.com/nodejs/node/pull/15391 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com>
Diffstat (limited to 'deps/v8/src/heap')
-rw-r--r--deps/v8/src/heap/heap.cc71
-rw-r--r--deps/v8/src/heap/heap.h34
2 files changed, 47 insertions, 58 deletions
diff --git a/deps/v8/src/heap/heap.cc b/deps/v8/src/heap/heap.cc
index ffc01ac91f..0b5a90afb0 100644
--- a/deps/v8/src/heap/heap.cc
+++ b/deps/v8/src/heap/heap.cc
@@ -58,15 +58,16 @@
namespace v8 {
namespace internal {
-bool Heap::GCCallbackPair::operator==(const Heap::GCCallbackPair& other) const {
- return other.callback == callback;
+bool Heap::GCCallbackTuple::operator==(
+ const Heap::GCCallbackTuple& other) const {
+ return other.callback == callback && other.data == data;
}
-Heap::GCCallbackPair& Heap::GCCallbackPair::operator=(
- const Heap::GCCallbackPair& other) {
+Heap::GCCallbackTuple& Heap::GCCallbackTuple::operator=(
+ const Heap::GCCallbackTuple& other) {
callback = other.callback;
gc_type = other.gc_type;
- pass_isolate = other.pass_isolate;
+ data = other.data;
return *this;
}
@@ -1592,35 +1593,21 @@ bool Heap::PerformGarbageCollection(
void Heap::CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags) {
RuntimeCallTimerScope runtime_timer(isolate(),
&RuntimeCallStats::GCPrologueCallback);
- for (const GCCallbackPair& info : gc_prologue_callbacks_) {
+ for (const GCCallbackTuple& info : gc_prologue_callbacks_) {
if (gc_type & info.gc_type) {
- if (!info.pass_isolate) {
- v8::GCCallback callback =
- reinterpret_cast<v8::GCCallback>(info.callback);
- callback(gc_type, flags);
- } else {
- v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate());
- info.callback(isolate, gc_type, flags);
- }
+ v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate());
+ info.callback(isolate, gc_type, flags, info.data);
}
}
}
-
-void Heap::CallGCEpilogueCallbacks(GCType gc_type,
- GCCallbackFlags gc_callback_flags) {
+void Heap::CallGCEpilogueCallbacks(GCType gc_type, GCCallbackFlags flags) {
RuntimeCallTimerScope runtime_timer(isolate(),
&RuntimeCallStats::GCEpilogueCallback);
- for (const GCCallbackPair& info : gc_epilogue_callbacks_) {
+ for (const GCCallbackTuple& info : gc_epilogue_callbacks_) {
if (gc_type & info.gc_type) {
- if (!info.pass_isolate) {
- v8::GCCallback callback =
- reinterpret_cast<v8::GCCallback>(info.callback);
- callback(gc_type, gc_callback_flags);
- } else {
- v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate());
- info.callback(isolate, gc_type, gc_callback_flags);
- }
+ v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate());
+ info.callback(isolate, gc_type, flags, info.data);
}
}
}
@@ -6192,21 +6179,21 @@ void Heap::TearDown() {
memory_allocator_ = nullptr;
}
-
-void Heap::AddGCPrologueCallback(v8::Isolate::GCCallback callback,
- GCType gc_type, bool pass_isolate) {
+void Heap::AddGCPrologueCallback(v8::Isolate::GCCallbackWithData callback,
+ GCType gc_type, void* data) {
DCHECK_NOT_NULL(callback);
DCHECK(gc_prologue_callbacks_.end() ==
std::find(gc_prologue_callbacks_.begin(), gc_prologue_callbacks_.end(),
- GCCallbackPair(callback, gc_type, pass_isolate)));
- gc_prologue_callbacks_.emplace_back(callback, gc_type, pass_isolate);
+ GCCallbackTuple(callback, gc_type, data)));
+ gc_prologue_callbacks_.emplace_back(callback, gc_type, data);
}
-
-void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) {
+void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallbackWithData callback,
+ void* data) {
DCHECK_NOT_NULL(callback);
for (size_t i = 0; i < gc_prologue_callbacks_.size(); i++) {
- if (gc_prologue_callbacks_[i].callback == callback) {
+ if (gc_prologue_callbacks_[i].callback == callback &&
+ gc_prologue_callbacks_[i].data == data) {
gc_prologue_callbacks_[i] = gc_prologue_callbacks_.back();
gc_prologue_callbacks_.pop_back();
return;
@@ -6215,21 +6202,21 @@ void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) {
UNREACHABLE();
}
-
-void Heap::AddGCEpilogueCallback(v8::Isolate::GCCallback callback,
- GCType gc_type, bool pass_isolate) {
+void Heap::AddGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback,
+ GCType gc_type, void* data) {
DCHECK_NOT_NULL(callback);
DCHECK(gc_epilogue_callbacks_.end() ==
std::find(gc_epilogue_callbacks_.begin(), gc_epilogue_callbacks_.end(),
- GCCallbackPair(callback, gc_type, pass_isolate)));
- gc_epilogue_callbacks_.emplace_back(callback, gc_type, pass_isolate);
+ GCCallbackTuple(callback, gc_type, data)));
+ gc_epilogue_callbacks_.emplace_back(callback, gc_type, data);
}
-
-void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) {
+void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback,
+ void* data) {
DCHECK_NOT_NULL(callback);
for (size_t i = 0; i < gc_epilogue_callbacks_.size(); i++) {
- if (gc_epilogue_callbacks_[i].callback == callback) {
+ if (gc_epilogue_callbacks_[i].callback == callback &&
+ gc_epilogue_callbacks_[i].data == data) {
gc_epilogue_callbacks_[i] = gc_epilogue_callbacks_.back();
gc_epilogue_callbacks_.pop_back();
return;
diff --git a/deps/v8/src/heap/heap.h b/deps/v8/src/heap/heap.h
index 72f93093b6..7b87770385 100644
--- a/deps/v8/src/heap/heap.h
+++ b/deps/v8/src/heap/heap.h
@@ -1435,13 +1435,15 @@ class Heap {
// Prologue/epilogue callback methods.========================================
// ===========================================================================
- void AddGCPrologueCallback(v8::Isolate::GCCallback callback,
- GCType gc_type_filter, bool pass_isolate = true);
- void RemoveGCPrologueCallback(v8::Isolate::GCCallback callback);
+ void AddGCPrologueCallback(v8::Isolate::GCCallbackWithData callback,
+ GCType gc_type_filter, void* data);
+ void RemoveGCPrologueCallback(v8::Isolate::GCCallbackWithData callback,
+ void* data);
- void AddGCEpilogueCallback(v8::Isolate::GCCallback callback,
- GCType gc_type_filter, bool pass_isolate = true);
- void RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback);
+ void AddGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback,
+ GCType gc_type_filter, void* data);
+ void RemoveGCEpilogueCallback(v8::Isolate::GCCallbackWithData callback,
+ void* data);
void CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags);
void CallGCEpilogueCallbacks(GCType gc_type, GCCallbackFlags flags);
@@ -1612,17 +1614,17 @@ class Heap {
RootListIndex index;
};
- struct GCCallbackPair {
- GCCallbackPair(v8::Isolate::GCCallback callback, GCType gc_type,
- bool pass_isolate)
- : callback(callback), gc_type(gc_type), pass_isolate(pass_isolate) {}
+ struct GCCallbackTuple {
+ GCCallbackTuple(v8::Isolate::GCCallbackWithData callback, GCType gc_type,
+ void* data)
+ : callback(callback), gc_type(gc_type), data(data) {}
- bool operator==(const GCCallbackPair& other) const;
- GCCallbackPair& operator=(const GCCallbackPair& other);
+ bool operator==(const GCCallbackTuple& other) const;
+ GCCallbackTuple& operator=(const GCCallbackTuple& other);
- v8::Isolate::GCCallback callback;
+ v8::Isolate::GCCallbackWithData callback;
GCType gc_type;
- bool pass_isolate;
+ void* data;
};
static const int kInitialStringTableSize = 2048;
@@ -2302,8 +2304,8 @@ class Heap {
// contains Smi(0) while marking is not active.
Object* encountered_weak_collections_;
- std::vector<GCCallbackPair> gc_epilogue_callbacks_;
- std::vector<GCCallbackPair> gc_prologue_callbacks_;
+ std::vector<GCCallbackTuple> gc_epilogue_callbacks_;
+ std::vector<GCCallbackTuple> gc_prologue_callbacks_;
GetExternallyAllocatedMemoryInBytesCallback external_memory_callback_;