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

Unified Diff: src/global-handles.cc

Issue 1358703003: Changed scavenge GC to collect unmodified references (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Updated to use a new unmodified flag instead of partially dependent flag Created 5 years, 3 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
Index: src/global-handles.cc
diff --git a/src/global-handles.cc b/src/global-handles.cc
index 650999f394c5cc7c2e5397afff53c74e3c186d20..fc1170e1588c5c9a3761f0b00772b393f05ddf1a 100644
--- a/src/global-handles.cc
+++ b/src/global-handles.cc
@@ -66,6 +66,7 @@ class GlobalHandles::Node {
set_independent(false);
set_partially_dependent(false);
set_in_new_space_list(false);
+ set_unmodified(false);
parameter_or_next_free_.next_free = NULL;
weak_callback_ = NULL;
}
@@ -77,6 +78,7 @@ class GlobalHandles::Node {
set_state(FREE);
set_weakness_type(NORMAL_WEAK);
set_in_new_space_list(false);
+ set_unmodified(false);
parameter_or_next_free_.next_free = *first_free;
*first_free = this;
}
@@ -87,6 +89,7 @@ class GlobalHandles::Node {
class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
set_independent(false);
set_partially_dependent(false);
+ set_unmodified(false);
set_state(NORMAL);
parameter_or_next_free_.parameter = NULL;
weak_callback_ = NULL;
@@ -107,6 +110,7 @@ class GlobalHandles::Node {
class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
set_independent(false);
set_partially_dependent(false);
+ set_unmodified(false);
weak_callback_ = NULL;
DecreaseBlockUses();
}
@@ -153,6 +157,10 @@ class GlobalHandles::Node {
flags_ = IsInNewSpaceList::update(flags_, v);
}
+ bool is_unmodified() { return flag_unmodified_; }
+
+ void set_unmodified(bool v) { flag_unmodified_ = v; }
+
WeaknessType weakness_type() const {
return NodeWeaknessType::decode(flags_);
}
@@ -354,6 +362,8 @@ class GlobalHandles::Node {
class NodeWeaknessType : public BitField<WeaknessType, 6, 2> {};
uint8_t flags_;
+ // Merge this with flags_ later on. May be we need to extend flags_
mythria 2015/09/28 15:20:08 I added a new field for the unmodified check.flags
jochen (gone - plz use gerrit) 2015/09/28 15:56:19 if the performance tests are looking good, we'll j
+ bool flag_unmodified_;
// Handle specific callback - might be a weak reference in disguise.
WeakCallback weak_callback_;
@@ -648,7 +658,7 @@ void GlobalHandles::IterateNewSpaceStrongAndDependentRoots(ObjectVisitor* v) {
Node* node = new_space_nodes_[i];
if (node->IsStrongRetainer() ||
(node->IsWeakRetainer() && !node->is_independent() &&
- !node->is_partially_dependent())) {
+ !node->is_partially_dependent() && !node->is_unmodified())) {
v->VisitPointer(node->location());
}
}
@@ -687,6 +697,48 @@ void GlobalHandles::IterateNewSpaceWeakIndependentRoots(ObjectVisitor* v) {
}
+void GlobalHandles::IdentifyWeakUnmodifiedObjects(WeakSlotCallback f) {
jochen (gone - plz use gerrit) 2015/09/28 15:56:19 nit. f -> is_unmodified()
mythria 2015/10/02 15:29:16 Done.
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
+ Node* node = new_space_nodes_[i];
+ if (node->IsWeak() && f(node->location())) {
+ node->set_partially_dependent(true);
rmcilroy 2015/09/28 17:32:46 fix to set_unmodified(true);
mythria 2015/10/02 15:29:15 Done.
+ }
+ }
+}
+
+
+void GlobalHandles::IdentifyNewSpaceWeakUnModifiedHandles(
+ WeakSlotCallbackWithHeap f) {
jochen (gone - plz use gerrit) 2015/09/28 15:56:19 f -> is_unscavenged
mythria 2015/10/02 15:29:15 Done.
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
+ Node* node = new_space_nodes_[i];
+ DCHECK(node->is_in_new_space_list());
+ if ((node->is_independent() || node->is_unmodified()) && node->IsWeak() &&
+ f(isolate_->heap(), node->location())) {
+ node->MarkPending();
+ }
+ }
+}
+
+
+void GlobalHandles::IterateNewSpaceWeakUnModifiedRoots(ObjectVisitor* v) {
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
+ Node* node = new_space_nodes_[i];
+ DCHECK(node->is_in_new_space_list());
+ if ((node->is_independent() || node->is_unmodified()) &&
+ node->IsWeakRetainer()) {
+ // Pending weak phantom handles die immediately. Everything else survives.
+ if (node->state() == Node::PENDING &&
+ node->weakness_type() != NORMAL_WEAK) {
+ node->CollectPhantomCallbackData(isolate(),
+ &pending_phantom_callbacks_);
+ } else {
+ v->VisitPointer(node->location());
+ }
+ }
+ }
+}
+
+
bool GlobalHandles::IterateObjectGroups(ObjectVisitor* v,
WeakSlotCallbackWithHeap can_skip) {
ComputeObjectGroupsAndImplicitReferences();
@@ -760,7 +812,8 @@ int GlobalHandles::PostScavengeProcessing(
// Skip dependent handles. Their weak callbacks might expect to be
// called between two global garbage collection callbacks which
// are not called for minor collections.
- if (!node->is_independent() && !node->is_partially_dependent()) {
+ if (!node->is_independent() && !node->is_partially_dependent() &&
+ !node->is_unmodified()) {
continue;
}
node->clear_partially_dependent();
« src/global-handles.h ('K') | « src/global-handles.h ('k') | src/heap/heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698