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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 | 449 |
447 result->debugger_ = new Debugger(); | 450 result->debugger_ = new Debugger(); |
448 result->debugger_->Initialize(result); | 451 result->debugger_->Initialize(result); |
449 if (FLAG_trace_isolates) { | 452 if (FLAG_trace_isolates) { |
450 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { | 453 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { |
451 OS::Print("[+] Starting isolate:\n" | 454 OS::Print("[+] Starting isolate:\n" |
452 "\tisolate: %s\n", result->name()); | 455 "\tisolate: %s\n", result->name()); |
453 } | 456 } |
454 } | 457 } |
455 | 458 |
456 | |
457 return result; | 459 return result; |
458 } | 460 } |
459 | 461 |
460 | 462 |
461 void Isolate::BuildName(const char* name_prefix) { | 463 void Isolate::BuildName(const char* name_prefix) { |
462 ASSERT(name_ == NULL); | 464 ASSERT(name_ == NULL); |
463 if (name_prefix == NULL) { | 465 if (name_prefix == NULL) { |
464 name_prefix = "isolate"; | 466 name_prefix = "isolate"; |
465 } | 467 } |
466 const char* kFormat = "%s-%lld"; | 468 const char* kFormat = "%s-%lld"; |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 } | 847 } |
846 | 848 |
847 // Visit the dart api state for all local and persistent handles. | 849 // Visit the dart api state for all local and persistent handles. |
848 if (api_state() != NULL) { | 850 if (api_state() != NULL) { |
849 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); | 851 api_state()->VisitObjectPointers(visitor, visit_prologue_weak_handles); |
850 } | 852 } |
851 | 853 |
852 // Visit the top context which is stored in the isolate. | 854 // Visit the top context which is stored in the isolate. |
853 visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_context_)); | 855 visitor->VisitPointer(reinterpret_cast<RawObject**>(&top_context_)); |
854 | 856 |
| 857 // Visit the current tag which is stored in the isolate. |
| 858 visitor->VisitPointer(reinterpret_cast<RawObject**>(¤t_tag_)); |
| 859 |
| 860 // Visit the tag table which is stored in the isolate. |
| 861 visitor->VisitPointer(reinterpret_cast<RawObject**>(&tag_table_)); |
| 862 |
855 // Visit objects in the debugger. | 863 // Visit objects in the debugger. |
856 debugger()->VisitObjectPointers(visitor); | 864 debugger()->VisitObjectPointers(visitor); |
857 | 865 |
858 // Visit objects that are being used for deoptimization. | 866 // Visit objects that are being used for deoptimization. |
859 if (deopt_context() != NULL) { | 867 if (deopt_context() != NULL) { |
860 deopt_context()->VisitObjectPointers(visitor); | 868 deopt_context()->VisitObjectPointers(visitor); |
861 } | 869 } |
862 } | 870 } |
863 | 871 |
864 | 872 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 ASSERT(state->id != Thread::kInvalidThreadId); | 972 ASSERT(state->id != Thread::kInvalidThreadId); |
965 ThreadInterrupter::InterruptThread(state); | 973 ThreadInterrupter::InterruptThread(state); |
966 } | 974 } |
967 | 975 |
968 | 976 |
969 void Isolate::ProfileIdle() { | 977 void Isolate::ProfileIdle() { |
970 vm_tag_counters_.Increment(vm_tag()); | 978 vm_tag_counters_.Increment(vm_tag()); |
971 } | 979 } |
972 | 980 |
973 | 981 |
| 982 void Isolate::set_tag_table(const GrowableObjectArray& value) { |
| 983 tag_table_ = value.raw(); |
| 984 } |
| 985 |
| 986 |
| 987 void Isolate::set_current_tag(const UserTag& tag) { |
| 988 intptr_t user_tag = tag.tag(); |
| 989 set_user_tag(static_cast<uword>(user_tag)); |
| 990 current_tag_ = tag.raw(); |
| 991 } |
| 992 |
| 993 |
| 994 void Isolate::clear_current_tag() { |
| 995 set_user_tag(UserTags::kNoUserTag); |
| 996 current_tag_ = UserTag::null(); |
| 997 } |
| 998 |
| 999 |
974 void Isolate::VisitIsolates(IsolateVisitor* visitor) { | 1000 void Isolate::VisitIsolates(IsolateVisitor* visitor) { |
975 if (visitor == NULL) { | 1001 if (visitor == NULL) { |
976 return; | 1002 return; |
977 } | 1003 } |
978 MonitorLocker ml(isolates_list_monitor_); | 1004 MonitorLocker ml(isolates_list_monitor_); |
979 Isolate* current = isolates_list_head_; | 1005 Isolate* current = isolates_list_head_; |
980 while (current) { | 1006 while (current) { |
981 visitor->VisitIsolate(current); | 1007 visitor->VisitIsolate(current); |
982 current = current->next_; | 1008 current = current->next_; |
983 } | 1009 } |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1133 return func.raw(); | 1159 return func.raw(); |
1134 } | 1160 } |
1135 | 1161 |
1136 | 1162 |
1137 void IsolateSpawnState::Cleanup() { | 1163 void IsolateSpawnState::Cleanup() { |
1138 SwitchIsolateScope switch_scope(isolate()); | 1164 SwitchIsolateScope switch_scope(isolate()); |
1139 Dart::ShutdownIsolate(); | 1165 Dart::ShutdownIsolate(); |
1140 } | 1166 } |
1141 | 1167 |
1142 } // namespace dart | 1168 } // namespace dart |
OLD | NEW |