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

Side by Side Diff: src/global-handles.cc

Issue 1883173002: [api] Bring back finalizers on global handles (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 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 unified diff | Download patch
« no previous file with comments | « src/global-handles.h ('k') | test/cctest/test-global-handles.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/global-handles.h" 5 #include "src/global-handles.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/v8.h" 8 #include "src/v8.h"
9 #include "src/vm-state-inl.h" 9 #include "src/vm-state-inl.h"
10 10
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 // Check for PENDING to ensure correct answer when processing callbacks. 190 // Check for PENDING to ensure correct answer when processing callbacks.
191 return state() == PENDING || state() == NEAR_DEATH; 191 return state() == PENDING || state() == NEAR_DEATH;
192 } 192 }
193 193
194 bool IsWeak() const { return state() == WEAK; } 194 bool IsWeak() const { return state() == WEAK; }
195 195
196 bool IsInUse() const { return state() != FREE; } 196 bool IsInUse() const { return state() != FREE; }
197 197
198 bool IsRetainer() const { 198 bool IsRetainer() const {
199 return state() != FREE && 199 return state() != FREE &&
200 !(state() == NEAR_DEATH && weakness_type() != NORMAL_WEAK); 200 !(state() == NEAR_DEATH && weakness_type() != NORMAL_WEAK &&
201 weakness_type() != FINALIZER_WEAK);
201 } 202 }
202 203
203 bool IsStrongRetainer() const { return state() == NORMAL; } 204 bool IsStrongRetainer() const { return state() == NORMAL; }
204 205
205 bool IsWeakRetainer() const { 206 bool IsWeakRetainer() const {
206 return state() == WEAK || state() == PENDING || 207 return state() == WEAK || state() == PENDING ||
207 (state() == NEAR_DEATH && weakness_type() == NORMAL_WEAK); 208 (state() == NEAR_DEATH && weakness_type() == NORMAL_WEAK &&
209 weakness_type() != FINALIZER_WEAK);
208 } 210 }
209 211
210 void MarkPending() { 212 void MarkPending() {
211 DCHECK(state() == WEAK); 213 DCHECK(state() == WEAK);
212 set_state(PENDING); 214 set_state(PENDING);
213 } 215 }
214 216
215 // Independent flag accessors. 217 // Independent flag accessors.
216 void MarkIndependent() { 218 void MarkIndependent() {
217 DCHECK(IsInUse()); 219 DCHECK(IsInUse());
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 v8::WeakCallbackType type) { 267 v8::WeakCallbackType type) {
266 DCHECK(phantom_callback != nullptr); 268 DCHECK(phantom_callback != nullptr);
267 DCHECK(IsInUse()); 269 DCHECK(IsInUse());
268 CHECK_NE(object_, reinterpret_cast<Object*>(kGlobalHandleZapValue)); 270 CHECK_NE(object_, reinterpret_cast<Object*>(kGlobalHandleZapValue));
269 set_state(WEAK); 271 set_state(WEAK);
270 switch (type) { 272 switch (type) {
271 case v8::WeakCallbackType::kParameter: 273 case v8::WeakCallbackType::kParameter:
272 set_weakness_type(PHANTOM_WEAK); 274 set_weakness_type(PHANTOM_WEAK);
273 break; 275 break;
274 case v8::WeakCallbackType::kInternalFields: 276 case v8::WeakCallbackType::kInternalFields:
275 set_weakness_type(PHANTOM_WEAK_2_INTERNAL_FIELDS); 277 set_weakness_type(PHANTOM_WEAK_2_INTERNAL_FIELDS);
276 break; 278 break;
279 case v8::WeakCallbackType::kFinalizer:
280 set_weakness_type(NORMAL_WEAK);
281 break;
277 } 282 }
278 set_parameter(parameter); 283 set_parameter(parameter);
279 weak_callback_ = reinterpret_cast<WeakCallback>(phantom_callback); 284 weak_callback_ = reinterpret_cast<WeakCallback>(phantom_callback);
280 } 285 }
281 286
282 void* ClearWeakness() { 287 void* ClearWeakness() {
283 DCHECK(IsInUse()); 288 DCHECK(IsInUse());
284 void* p = parameter(); 289 void* p = parameter();
285 set_state(NORMAL); 290 set_state(NORMAL);
286 set_parameter(NULL); 291 set_parameter(NULL);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 return false; 330 return false;
326 } 331 }
327 set_state(NEAR_DEATH); 332 set_state(NEAR_DEATH);
328 333
329 // Check that we are not passing a finalized external string to 334 // Check that we are not passing a finalized external string to
330 // the callback. 335 // the callback.
331 DCHECK(!object_->IsExternalOneByteString() || 336 DCHECK(!object_->IsExternalOneByteString() ||
332 ExternalOneByteString::cast(object_)->resource() != NULL); 337 ExternalOneByteString::cast(object_)->resource() != NULL);
333 DCHECK(!object_->IsExternalTwoByteString() || 338 DCHECK(!object_->IsExternalTwoByteString() ||
334 ExternalTwoByteString::cast(object_)->resource() != NULL); 339 ExternalTwoByteString::cast(object_)->resource() != NULL);
335 if (weakness_type() != NORMAL_WEAK) return false; 340 if (weakness_type() != NORMAL_WEAK && weakness_type() != FINALIZER_WEAK) {
341 return false;
342 }
336 343
337 // Leaving V8. 344 // Leaving V8.
338 VMState<EXTERNAL> vmstate(isolate); 345 VMState<EXTERNAL> vmstate(isolate);
339 HandleScope handle_scope(isolate); 346 HandleScope handle_scope(isolate);
340 Object** object = location(); 347 if (weakness_type() == NORMAL_WEAK) {
341 Handle<Object> handle(*object, isolate); 348 Object** object = location();
342 v8::WeakCallbackData<v8::Value, void> data( 349 Handle<Object> handle(*object, isolate);
343 reinterpret_cast<v8::Isolate*>(isolate), parameter(), 350 v8::WeakCallbackData<v8::Value, void> data(
344 v8::Utils::ToLocal(handle)); 351 reinterpret_cast<v8::Isolate*>(isolate), parameter(),
345 set_parameter(NULL); 352 v8::Utils::ToLocal(handle));
346 weak_callback_(data); 353 set_parameter(NULL);
354 weak_callback_(data);
355 } else {
356 void* internal_fields[v8::kInternalFieldsInWeakCallback] = {nullptr,
357 nullptr};
noordhuis 2016/04/14 14:52:36 Femto-nit, but other places that depend on v8::kIn
jochen (gone - plz use gerrit) 2016/04/14 15:16:04 i copied this from https://code.google.com/p/chrom
358 v8::WeakCallbackInfo<void> data(reinterpret_cast<v8::Isolate*>(isolate),
359 parameter(), internal_fields, nullptr);
360 auto callback = reinterpret_cast<v8::WeakCallbackInfo<void>::Callback>(
361 weak_callback_);
362 callback(data);
363 }
347 364
348 // Absence of explicit cleanup or revival of weak handle 365 // Absence of explicit cleanup or revival of weak handle
349 // in most of the cases would lead to memory leak. 366 // in most of the cases would lead to memory leak.
350 CHECK(state() != NEAR_DEATH); 367 CHECK(state() != NEAR_DEATH);
351 return true; 368 return true;
352 } 369 }
353 370
354 inline GlobalHandles* GetGlobalHandles(); 371 inline GlobalHandles* GetGlobalHandles();
355 372
356 private: 373 private:
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 bool GlobalHandles::IsWeak(Object** location) { 660 bool GlobalHandles::IsWeak(Object** location) {
644 return Node::FromLocation(location)->IsWeak(); 661 return Node::FromLocation(location)->IsWeak();
645 } 662 }
646 663
647 void GlobalHandles::IterateWeakRoots(ObjectVisitor* v) { 664 void GlobalHandles::IterateWeakRoots(ObjectVisitor* v) {
648 for (NodeIterator it(this); !it.done(); it.Advance()) { 665 for (NodeIterator it(this); !it.done(); it.Advance()) {
649 Node* node = it.node(); 666 Node* node = it.node();
650 if (node->IsWeakRetainer()) { 667 if (node->IsWeakRetainer()) {
651 // Pending weak phantom handles die immediately. Everything else survives. 668 // Pending weak phantom handles die immediately. Everything else survives.
652 if (node->state() == Node::PENDING && 669 if (node->state() == Node::PENDING &&
653 node->weakness_type() != NORMAL_WEAK) { 670 node->weakness_type() != NORMAL_WEAK &&
654 node->CollectPhantomCallbackData(isolate(), 671 node->weakness_type() != FINALIZER_WEAK) {
655 &pending_phantom_callbacks_); 672 node->CollectPhantomCallbackData(isolate(),
673 &pending_phantom_callbacks_);
656 } else { 674 } else {
657 v->VisitPointer(node->location()); 675 v->VisitPointer(node->location());
658 } 676 }
659 } 677 }
660 } 678 }
661 } 679 }
662 680
663 681
664 void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) { 682 void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) {
665 for (NodeIterator it(this); !it.done(); it.Advance()) { 683 for (NodeIterator it(this); !it.done(); it.Advance()) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 722
705 723
706 void GlobalHandles::IterateNewSpaceWeakIndependentRoots(ObjectVisitor* v) { 724 void GlobalHandles::IterateNewSpaceWeakIndependentRoots(ObjectVisitor* v) {
707 for (int i = 0; i < new_space_nodes_.length(); ++i) { 725 for (int i = 0; i < new_space_nodes_.length(); ++i) {
708 Node* node = new_space_nodes_[i]; 726 Node* node = new_space_nodes_[i];
709 DCHECK(node->is_in_new_space_list()); 727 DCHECK(node->is_in_new_space_list());
710 if ((node->is_independent() || node->is_partially_dependent()) && 728 if ((node->is_independent() || node->is_partially_dependent()) &&
711 node->IsWeakRetainer()) { 729 node->IsWeakRetainer()) {
712 // Pending weak phantom handles die immediately. Everything else survives. 730 // Pending weak phantom handles die immediately. Everything else survives.
713 if (node->state() == Node::PENDING && 731 if (node->state() == Node::PENDING &&
714 node->weakness_type() != NORMAL_WEAK) { 732 node->weakness_type() != NORMAL_WEAK &&
733 node->weakness_type() != FINALIZER_WEAK) {
715 node->CollectPhantomCallbackData(isolate(), 734 node->CollectPhantomCallbackData(isolate(),
716 &pending_phantom_callbacks_); 735 &pending_phantom_callbacks_);
717 } else { 736 } else {
718 v->VisitPointer(node->location()); 737 v->VisitPointer(node->location());
719 } 738 }
720 } 739 }
721 } 740 }
722 } 741 }
723 742
724 743
(...skipping 22 matching lines...) Expand all
747 766
748 767
749 void GlobalHandles::IterateNewSpaceWeakUnmodifiedRoots(ObjectVisitor* v) { 768 void GlobalHandles::IterateNewSpaceWeakUnmodifiedRoots(ObjectVisitor* v) {
750 for (int i = 0; i < new_space_nodes_.length(); ++i) { 769 for (int i = 0; i < new_space_nodes_.length(); ++i) {
751 Node* node = new_space_nodes_[i]; 770 Node* node = new_space_nodes_[i];
752 DCHECK(node->is_in_new_space_list()); 771 DCHECK(node->is_in_new_space_list());
753 if ((node->is_independent() || !node->is_active()) && 772 if ((node->is_independent() || !node->is_active()) &&
754 node->IsWeakRetainer()) { 773 node->IsWeakRetainer()) {
755 // Pending weak phantom handles die immediately. Everything else survives. 774 // Pending weak phantom handles die immediately. Everything else survives.
756 if (node->state() == Node::PENDING && 775 if (node->state() == Node::PENDING &&
757 node->weakness_type() != NORMAL_WEAK) { 776 node->weakness_type() != NORMAL_WEAK &&
777 node->weakness_type() != FINALIZER_WEAK) {
758 node->CollectPhantomCallbackData(isolate(), 778 node->CollectPhantomCallbackData(isolate(),
759 &pending_phantom_callbacks_); 779 &pending_phantom_callbacks_);
760 } else { 780 } else {
761 v->VisitPointer(node->location()); 781 v->VisitPointer(node->location());
762 } 782 }
763 } 783 }
764 } 784 }
765 } 785 }
766 786
767 787
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 blocks_[block][offset] = object; 1501 blocks_[block][offset] = object;
1482 if (isolate->heap()->InNewSpace(object)) { 1502 if (isolate->heap()->InNewSpace(object)) {
1483 new_space_indices_.Add(size_); 1503 new_space_indices_.Add(size_);
1484 } 1504 }
1485 *index = size_++; 1505 *index = size_++;
1486 } 1506 }
1487 1507
1488 1508
1489 } // namespace internal 1509 } // namespace internal
1490 } // namespace v8 1510 } // namespace v8
OLDNEW
« no previous file with comments | « src/global-handles.h ('k') | test/cctest/test-global-handles.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698