OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/heap/heap.h" | 5 #include "src/heap/heap.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 GCTracer::Scope gc_scope(tracer(), | 765 GCTracer::Scope gc_scope(tracer(), |
766 GCTracer::Scope::MC_INCREMENTAL_WEAKCLOSURE); | 766 GCTracer::Scope::MC_INCREMENTAL_WEAKCLOSURE); |
767 | 767 |
768 { | 768 { |
769 GCCallbacksScope scope(this); | 769 GCCallbacksScope scope(this); |
770 if (scope.CheckReenter()) { | 770 if (scope.CheckReenter()) { |
771 AllowHeapAllocation allow_allocation; | 771 AllowHeapAllocation allow_allocation; |
772 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); | 772 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); |
773 VMState<EXTERNAL> state(isolate_); | 773 VMState<EXTERNAL> state(isolate_); |
774 HandleScope handle_scope(isolate_); | 774 HandleScope handle_scope(isolate_); |
| 775 // TODO(mlippautz): Report kGCTypeIncremental once blink updates its |
| 776 // filtering. |
775 CallGCPrologueCallbacks(kGCTypeMarkSweepCompact, kNoGCCallbackFlags); | 777 CallGCPrologueCallbacks(kGCTypeMarkSweepCompact, kNoGCCallbackFlags); |
776 } | 778 } |
777 } | 779 } |
778 incremental_marking()->MarkObjectGroups(); | 780 incremental_marking()->MarkObjectGroups(); |
779 { | 781 { |
780 GCCallbacksScope scope(this); | 782 GCCallbacksScope scope(this); |
781 if (scope.CheckReenter()) { | 783 if (scope.CheckReenter()) { |
782 AllowHeapAllocation allow_allocation; | 784 AllowHeapAllocation allow_allocation; |
783 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); | 785 GCTracer::Scope scope(tracer(), GCTracer::Scope::EXTERNAL); |
784 VMState<EXTERNAL> state(isolate_); | 786 VMState<EXTERNAL> state(isolate_); |
785 HandleScope handle_scope(isolate_); | 787 HandleScope handle_scope(isolate_); |
| 788 // TODO(mlippautz): Report kGCTypeIncremental once blink updates its |
| 789 // filtering. |
786 CallGCEpilogueCallbacks(kGCTypeMarkSweepCompact, kNoGCCallbackFlags); | 790 CallGCEpilogueCallbacks(kGCTypeMarkSweepCompact, kNoGCCallbackFlags); |
787 } | 791 } |
788 } | 792 } |
789 } | 793 } |
790 | 794 |
791 | 795 |
792 void Heap::CollectAllGarbage(int flags, const char* gc_reason, | 796 void Heap::CollectAllGarbage(int flags, const char* gc_reason, |
793 const v8::GCCallbackFlags gc_callback_flags) { | 797 const v8::GCCallbackFlags gc_callback_flags) { |
794 // Since we are ignoring the return value, the exact choice of space does | 798 // Since we are ignoring the return value, the exact choice of space does |
795 // not matter, so long as we do not specify NEW_SPACE, which would not | 799 // not matter, so long as we do not specify NEW_SPACE, which would not |
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1281 } | 1285 } |
1282 #endif | 1286 #endif |
1283 | 1287 |
1284 return freed_global_handles > 0; | 1288 return freed_global_handles > 0; |
1285 } | 1289 } |
1286 | 1290 |
1287 | 1291 |
1288 void Heap::CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags) { | 1292 void Heap::CallGCPrologueCallbacks(GCType gc_type, GCCallbackFlags flags) { |
1289 for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) { | 1293 for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) { |
1290 if (gc_type & gc_prologue_callbacks_[i].gc_type) { | 1294 if (gc_type & gc_prologue_callbacks_[i].gc_type) { |
1291 if (!gc_prologue_callbacks_[i].pass_isolate_) { | 1295 if (!gc_prologue_callbacks_[i].pass_isolate) { |
1292 v8::GCPrologueCallback callback = | 1296 v8::GCCallback callback = reinterpret_cast<v8::GCCallback>( |
1293 reinterpret_cast<v8::GCPrologueCallback>( | 1297 gc_prologue_callbacks_[i].callback); |
1294 gc_prologue_callbacks_[i].callback); | |
1295 callback(gc_type, flags); | 1298 callback(gc_type, flags); |
1296 } else { | 1299 } else { |
1297 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | 1300 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); |
1298 gc_prologue_callbacks_[i].callback(isolate, gc_type, flags); | 1301 gc_prologue_callbacks_[i].callback(isolate, gc_type, flags); |
1299 } | 1302 } |
1300 } | 1303 } |
1301 } | 1304 } |
1302 } | 1305 } |
1303 | 1306 |
1304 | 1307 |
1305 void Heap::CallGCEpilogueCallbacks(GCType gc_type, | 1308 void Heap::CallGCEpilogueCallbacks(GCType gc_type, |
1306 GCCallbackFlags gc_callback_flags) { | 1309 GCCallbackFlags gc_callback_flags) { |
1307 for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) { | 1310 for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) { |
1308 if (gc_type & gc_epilogue_callbacks_[i].gc_type) { | 1311 if (gc_type & gc_epilogue_callbacks_[i].gc_type) { |
1309 if (!gc_epilogue_callbacks_[i].pass_isolate_) { | 1312 if (!gc_epilogue_callbacks_[i].pass_isolate) { |
1310 v8::GCPrologueCallback callback = | 1313 v8::GCCallback callback = reinterpret_cast<v8::GCCallback>( |
1311 reinterpret_cast<v8::GCPrologueCallback>( | 1314 gc_epilogue_callbacks_[i].callback); |
1312 gc_epilogue_callbacks_[i].callback); | |
1313 callback(gc_type, gc_callback_flags); | 1315 callback(gc_type, gc_callback_flags); |
1314 } else { | 1316 } else { |
1315 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); | 1317 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this->isolate()); |
1316 gc_epilogue_callbacks_[i].callback(isolate, gc_type, gc_callback_flags); | 1318 gc_epilogue_callbacks_[i].callback(isolate, gc_type, gc_callback_flags); |
1317 } | 1319 } |
1318 } | 1320 } |
1319 } | 1321 } |
1320 } | 1322 } |
1321 | 1323 |
1322 | 1324 |
(...skipping 4621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5944 | 5946 |
5945 StrongRootsList* next = NULL; | 5947 StrongRootsList* next = NULL; |
5946 for (StrongRootsList* list = strong_roots_list_; list; list = next) { | 5948 for (StrongRootsList* list = strong_roots_list_; list; list = next) { |
5947 next = list->next; | 5949 next = list->next; |
5948 delete list; | 5950 delete list; |
5949 } | 5951 } |
5950 strong_roots_list_ = NULL; | 5952 strong_roots_list_ = NULL; |
5951 } | 5953 } |
5952 | 5954 |
5953 | 5955 |
5954 void Heap::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback, | 5956 void Heap::AddGCPrologueCallback(v8::Isolate::GCCallback callback, |
5955 GCType gc_type, bool pass_isolate) { | 5957 GCType gc_type, bool pass_isolate) { |
5956 DCHECK(callback != NULL); | 5958 DCHECK(callback != NULL); |
5957 GCPrologueCallbackPair pair(callback, gc_type, pass_isolate); | 5959 GCCallbackPair pair(callback, gc_type, pass_isolate); |
5958 DCHECK(!gc_prologue_callbacks_.Contains(pair)); | 5960 DCHECK(!gc_prologue_callbacks_.Contains(pair)); |
5959 return gc_prologue_callbacks_.Add(pair); | 5961 return gc_prologue_callbacks_.Add(pair); |
5960 } | 5962 } |
5961 | 5963 |
5962 | 5964 |
5963 void Heap::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback) { | 5965 void Heap::RemoveGCPrologueCallback(v8::Isolate::GCCallback callback) { |
5964 DCHECK(callback != NULL); | 5966 DCHECK(callback != NULL); |
5965 for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) { | 5967 for (int i = 0; i < gc_prologue_callbacks_.length(); ++i) { |
5966 if (gc_prologue_callbacks_[i].callback == callback) { | 5968 if (gc_prologue_callbacks_[i].callback == callback) { |
5967 gc_prologue_callbacks_.Remove(i); | 5969 gc_prologue_callbacks_.Remove(i); |
5968 return; | 5970 return; |
5969 } | 5971 } |
5970 } | 5972 } |
5971 UNREACHABLE(); | 5973 UNREACHABLE(); |
5972 } | 5974 } |
5973 | 5975 |
5974 | 5976 |
5975 void Heap::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, | 5977 void Heap::AddGCEpilogueCallback(v8::Isolate::GCCallback callback, |
5976 GCType gc_type, bool pass_isolate) { | 5978 GCType gc_type, bool pass_isolate) { |
5977 DCHECK(callback != NULL); | 5979 DCHECK(callback != NULL); |
5978 GCEpilogueCallbackPair pair(callback, gc_type, pass_isolate); | 5980 GCCallbackPair pair(callback, gc_type, pass_isolate); |
5979 DCHECK(!gc_epilogue_callbacks_.Contains(pair)); | 5981 DCHECK(!gc_epilogue_callbacks_.Contains(pair)); |
5980 return gc_epilogue_callbacks_.Add(pair); | 5982 return gc_epilogue_callbacks_.Add(pair); |
5981 } | 5983 } |
5982 | 5984 |
5983 | 5985 |
5984 void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback) { | 5986 void Heap::RemoveGCEpilogueCallback(v8::Isolate::GCCallback callback) { |
5985 DCHECK(callback != NULL); | 5987 DCHECK(callback != NULL); |
5986 for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) { | 5988 for (int i = 0; i < gc_epilogue_callbacks_.length(); ++i) { |
5987 if (gc_epilogue_callbacks_[i].callback == callback) { | 5989 if (gc_epilogue_callbacks_[i].callback == callback) { |
5988 gc_epilogue_callbacks_.Remove(i); | 5990 gc_epilogue_callbacks_.Remove(i); |
5989 return; | 5991 return; |
5990 } | 5992 } |
5991 } | 5993 } |
5992 UNREACHABLE(); | 5994 UNREACHABLE(); |
5993 } | 5995 } |
5994 | 5996 |
(...skipping 906 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6901 *object_type = "CODE_TYPE"; \ | 6903 *object_type = "CODE_TYPE"; \ |
6902 *object_sub_type = "CODE_AGE/" #name; \ | 6904 *object_sub_type = "CODE_AGE/" #name; \ |
6903 return true; | 6905 return true; |
6904 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) | 6906 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) |
6905 #undef COMPARE_AND_RETURN_NAME | 6907 #undef COMPARE_AND_RETURN_NAME |
6906 } | 6908 } |
6907 return false; | 6909 return false; |
6908 } | 6910 } |
6909 } // namespace internal | 6911 } // namespace internal |
6910 } // namespace v8 | 6912 } // namespace v8 |
OLD | NEW |