Chromium Code Reviews| 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(); |