OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/isolate.h" | 5 #include "vm/isolate.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "platform/json.h" | 9 #include "platform/json.h" |
10 #include "lib/mirrors.h" | 10 #include "lib/mirrors.h" |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 gc_prologue_callback_(NULL), | 329 gc_prologue_callback_(NULL), |
330 gc_epilogue_callback_(NULL), | 330 gc_epilogue_callback_(NULL), |
331 defer_finalization_count_(0), | 331 defer_finalization_count_(0), |
332 deopt_context_(NULL), | 332 deopt_context_(NULL), |
333 stacktrace_(NULL), | 333 stacktrace_(NULL), |
334 stack_frame_index_(-1), | 334 stack_frame_index_(-1), |
335 cha_used_(false), | 335 cha_used_(false), |
336 object_id_ring_(NULL), | 336 object_id_ring_(NULL), |
337 profiler_data_(NULL), | 337 profiler_data_(NULL), |
338 thread_state_(NULL), | 338 thread_state_(NULL), |
| 339 tag_table_(GrowableObjectArray::null()), |
| 340 current_tag_(UserTag::null()), |
339 next_(NULL), | 341 next_(NULL), |
340 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | 342 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
341 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | 343 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
342 reusable_handles_() { | 344 reusable_handles_() { |
343 set_vm_tag(VMTag::kIdleTagId); | 345 set_vm_tag(VMTag::kIdleTagId); |
| 346 set_user_tag(UserTags::kNoUserTag); |
344 } | 347 } |
345 #undef REUSABLE_HANDLE_SCOPE_INIT | 348 #undef REUSABLE_HANDLE_SCOPE_INIT |
346 #undef REUSABLE_HANDLE_INITIALIZERS | 349 #undef REUSABLE_HANDLE_INITIALIZERS |
347 | 350 |
348 | 351 |
349 Isolate::~Isolate() { | 352 Isolate::~Isolate() { |
350 delete [] name_; | 353 delete [] name_; |
351 delete heap_; | 354 delete heap_; |
352 delete object_store_; | 355 delete object_store_; |
353 delete api_state_; | 356 delete api_state_; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 | 446 |
444 result->debugger_ = new Debugger(); | 447 result->debugger_ = new Debugger(); |
445 result->debugger_->Initialize(result); | 448 result->debugger_->Initialize(result); |
446 if (FLAG_trace_isolates) { | 449 if (FLAG_trace_isolates) { |
447 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { | 450 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { |
448 OS::Print("[+] Starting isolate:\n" | 451 OS::Print("[+] Starting isolate:\n" |
449 "\tisolate: %s\n", result->name()); | 452 "\tisolate: %s\n", result->name()); |
450 } | 453 } |
451 } | 454 } |
452 | 455 |
453 | |
454 return result; | 456 return result; |
455 } | 457 } |
456 | 458 |
457 | 459 |
458 void Isolate::BuildName(const char* name_prefix) { | 460 void Isolate::BuildName(const char* name_prefix) { |
459 ASSERT(name_ == NULL); | 461 ASSERT(name_ == NULL); |
460 if (name_prefix == NULL) { | 462 if (name_prefix == NULL) { |
461 name_prefix = "isolate"; | 463 name_prefix = "isolate"; |
462 } | 464 } |
463 const char* kFormat = "%s-%lld"; | 465 const char* kFormat = "%s-%lld"; |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 } | 844 } |
843 | 845 |
844 // Visit the dart api state for all local and persistent handles. | 846 // Visit the dart api state for all local and persistent handles. |
845 if (api_state() != NULL) { | 847 if (api_state() != NULL) { |
846 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); | 848 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); |
847 } | 849 } |
848 | 850 |
849 // Visit the top context which is stored in the isolate. | 851 // Visit the top context which is stored in the isolate. |
850 visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_context_)); | 852 visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_context_)); |
851 | 853 |
| 854 // Visit the current tag which is stored in the isolate. |
| 855 visitor->VisitPointer(reinterpret_cast<RawObject**>(¤t_tag_)); |
| 856 |
| 857 // Visit the tag table which is stored in the isolate. |
| 858 visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_)); |
| 859 |
852 // Visit objects in the debugger. | 860 // Visit objects in the debugger. |
853 debugger()->VisitObjectPointers(visitor); | 861 debugger()->VisitObjectPointers(visitor); |
854 | 862 |
855 // Visit objects that are being used for deoptimization. | 863 // Visit objects that are being used for deoptimization. |
856 if (deopt_context() != NULL) { | 864 if (deopt_context() != NULL) { |
857 deopt_context()->VisitObjectPointers(visitor); | 865 deopt_context()->VisitObjectPointers(visitor); |
858 } | 866 } |
859 } | 867 } |
860 | 868 |
861 | 869 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
961 ASSERT(state->id != Thread::kInvalidThreadId); | 969 ASSERT(state->id != Thread::kInvalidThreadId); |
962 ThreadInterrupter::InterruptThread(state); | 970 ThreadInterrupter::InterruptThread(state); |
963 } | 971 } |
964 | 972 |
965 | 973 |
966 void Isolate::ProfileIdle() { | 974 void Isolate::ProfileIdle() { |
967 vm_tag_counters_.Increment(vm_tag()); | 975 vm_tag_counters_.Increment(vm_tag()); |
968 } | 976 } |
969 | 977 |
970 | 978 |
| 979 void Isolate::set_tag_table(const GrowableObjectArray& value) { |
| 980 tag_table_ = value.raw(); |
| 981 } |
| 982 |
| 983 |
| 984 void Isolate::set_current_tag(const UserTag& tag) { |
| 985 intptr_t user_tag = tag.tag(); |
| 986 set_user_tag(static_cast<uword>(user_tag)); |
| 987 current_tag_ = tag.raw(); |
| 988 } |
| 989 |
| 990 |
| 991 void Isolate::clear_current_tag() { |
| 992 set_user_tag(UserTags::kNoUserTag); |
| 993 current_tag_ = UserTag::null(); |
| 994 } |
| 995 |
| 996 |
971 void Isolate::VisitIsolates(IsolateVisitor* visitor) { | 997 void Isolate::VisitIsolates(IsolateVisitor* visitor) { |
972 if (visitor == NULL) { | 998 if (visitor == NULL) { |
973 return; | 999 return; |
974 } | 1000 } |
975 MonitorLocker ml(isolates_list_monitor_); | 1001 MonitorLocker ml(isolates_list_monitor_); |
976 Isolate* current = isolates_list_head_; | 1002 Isolate* current = isolates_list_head_; |
977 while (current) { | 1003 while (current) { |
978 visitor->VisitIsolate(current); | 1004 visitor->VisitIsolate(current); |
979 current = current->next_; | 1005 current = current->next_; |
980 } | 1006 } |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1130 return func.raw(); | 1156 return func.raw(); |
1131 } | 1157 } |
1132 | 1158 |
1133 | 1159 |
1134 void IsolateSpawnState::Cleanup() { | 1160 void IsolateSpawnState::Cleanup() { |
1135 SwitchIsolateScope switch_scope(isolate()); | 1161 SwitchIsolateScope switch_scope(isolate()); |
1136 Dart::ShutdownIsolate(); | 1162 Dart::ShutdownIsolate(); |
1137 } | 1163 } |
1138 | 1164 |
1139 } // namespace dart | 1165 } // namespace dart |
OLD | NEW |