| OLD | NEW |
| 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 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 810 object_groups_.Rewind(last); | 810 object_groups_.Rewind(last); |
| 811 return any_group_was_visited; | 811 return any_group_was_visited; |
| 812 } | 812 } |
| 813 | 813 |
| 814 | 814 |
| 815 void GlobalHandles::InvokeSecondPassPhantomCallbacks( | 815 void GlobalHandles::InvokeSecondPassPhantomCallbacks( |
| 816 List<PendingPhantomCallback>* callbacks, Isolate* isolate) { | 816 List<PendingPhantomCallback>* callbacks, Isolate* isolate) { |
| 817 while (callbacks->length() != 0) { | 817 while (callbacks->length() != 0) { |
| 818 auto callback = callbacks->RemoveLast(); | 818 auto callback = callbacks->RemoveLast(); |
| 819 DCHECK(callback.node() == nullptr); | 819 DCHECK(callback.node() == nullptr); |
| 820 // No second pass callback required. | |
| 821 if (callback.callback() == nullptr) continue; | |
| 822 // Fire second pass callback | 820 // Fire second pass callback |
| 823 callback.Invoke(isolate); | 821 callback.Invoke(isolate); |
| 824 } | 822 } |
| 825 } | 823 } |
| 826 | 824 |
| 827 | 825 |
| 828 int GlobalHandles::PostScavengeProcessing( | 826 int GlobalHandles::PostScavengeProcessing( |
| 829 const int initial_post_gc_processing_count) { | 827 const int initial_post_gc_processing_count) { |
| 830 int freed_nodes = 0; | 828 int freed_nodes = 0; |
| 831 for (int i = 0; i < new_space_nodes_.length(); ++i) { | 829 for (int i = 0; i < new_space_nodes_.length(); ++i) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 } | 915 } |
| 918 } | 916 } |
| 919 new_space_nodes_.Rewind(last); | 917 new_space_nodes_.Rewind(last); |
| 920 new_space_nodes_.Trim(); | 918 new_space_nodes_.Trim(); |
| 921 } | 919 } |
| 922 | 920 |
| 923 | 921 |
| 924 int GlobalHandles::DispatchPendingPhantomCallbacks( | 922 int GlobalHandles::DispatchPendingPhantomCallbacks( |
| 925 bool synchronous_second_pass) { | 923 bool synchronous_second_pass) { |
| 926 int freed_nodes = 0; | 924 int freed_nodes = 0; |
| 925 List<PendingPhantomCallback> second_pass_callbacks; |
| 927 { | 926 { |
| 928 // The initial pass callbacks must simply clear the nodes. | 927 // The initial pass callbacks must simply clear the nodes. |
| 929 for (auto i = pending_phantom_callbacks_.begin(); | 928 for (auto i = pending_phantom_callbacks_.begin(); |
| 930 i != pending_phantom_callbacks_.end(); ++i) { | 929 i != pending_phantom_callbacks_.end(); ++i) { |
| 931 auto callback = i; | 930 auto callback = i; |
| 932 // Skip callbacks that have already been processed once. | 931 // Skip callbacks that have already been processed once. |
| 933 if (callback->node() == nullptr) continue; | 932 if (callback->node() == nullptr) continue; |
| 934 callback->Invoke(isolate()); | 933 callback->Invoke(isolate()); |
| 934 if (callback->callback()) second_pass_callbacks.Add(*callback); |
| 935 freed_nodes++; | 935 freed_nodes++; |
| 936 } | 936 } |
| 937 } | 937 } |
| 938 if (pending_phantom_callbacks_.length() > 0) { | 938 pending_phantom_callbacks_.Clear(); |
| 939 if (second_pass_callbacks.length() > 0) { |
| 939 if (FLAG_optimize_for_size || FLAG_predictable || synchronous_second_pass) { | 940 if (FLAG_optimize_for_size || FLAG_predictable || synchronous_second_pass) { |
| 940 isolate()->heap()->CallGCPrologueCallbacks( | 941 isolate()->heap()->CallGCPrologueCallbacks( |
| 941 GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags); | 942 GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags); |
| 942 InvokeSecondPassPhantomCallbacks(&pending_phantom_callbacks_, isolate()); | 943 InvokeSecondPassPhantomCallbacks(&second_pass_callbacks, isolate()); |
| 943 isolate()->heap()->CallGCEpilogueCallbacks( | 944 isolate()->heap()->CallGCEpilogueCallbacks( |
| 944 GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags); | 945 GCType::kGCTypeProcessWeakCallbacks, kNoGCCallbackFlags); |
| 945 } else { | 946 } else { |
| 946 auto task = new PendingPhantomCallbacksSecondPassTask( | 947 auto task = new PendingPhantomCallbacksSecondPassTask( |
| 947 &pending_phantom_callbacks_, isolate()); | 948 &second_pass_callbacks, isolate()); |
| 948 V8::GetCurrentPlatform()->CallOnForegroundThread( | 949 V8::GetCurrentPlatform()->CallOnForegroundThread( |
| 949 reinterpret_cast<v8::Isolate*>(isolate()), task); | 950 reinterpret_cast<v8::Isolate*>(isolate()), task); |
| 950 } | 951 } |
| 951 } | 952 } |
| 952 pending_phantom_callbacks_.Clear(); | |
| 953 return freed_nodes; | 953 return freed_nodes; |
| 954 } | 954 } |
| 955 | 955 |
| 956 | 956 |
| 957 void GlobalHandles::PendingPhantomCallback::Invoke(Isolate* isolate) { | 957 void GlobalHandles::PendingPhantomCallback::Invoke(Isolate* isolate) { |
| 958 Data::Callback* callback_addr = nullptr; | 958 Data::Callback* callback_addr = nullptr; |
| 959 if (node_ != nullptr) { | 959 if (node_ != nullptr) { |
| 960 // Initialize for first pass callback. | 960 // Initialize for first pass callback. |
| 961 DCHECK(node_->state() == Node::NEAR_DEATH); | 961 DCHECK(node_->state() == Node::NEAR_DEATH); |
| 962 callback_addr = &callback_; | 962 callback_addr = &callback_; |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 blocks_[block][offset] = object; | 1377 blocks_[block][offset] = object; |
| 1378 if (isolate->heap()->InNewSpace(object)) { | 1378 if (isolate->heap()->InNewSpace(object)) { |
| 1379 new_space_indices_.Add(size_); | 1379 new_space_indices_.Add(size_); |
| 1380 } | 1380 } |
| 1381 *index = size_++; | 1381 *index = size_++; |
| 1382 } | 1382 } |
| 1383 | 1383 |
| 1384 | 1384 |
| 1385 } // namespace internal | 1385 } // namespace internal |
| 1386 } // namespace v8 | 1386 } // namespace v8 |
| OLD | NEW |