| 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 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 stacktrace_(NULL), | 331 stacktrace_(NULL), |
| 332 stack_frame_index_(-1), | 332 stack_frame_index_(-1), |
| 333 cha_used_(false), | 333 cha_used_(false), |
| 334 object_id_ring_(NULL), | 334 object_id_ring_(NULL), |
| 335 profiler_data_(NULL), | 335 profiler_data_(NULL), |
| 336 thread_state_(NULL), | 336 thread_state_(NULL), |
| 337 next_(NULL), | 337 next_(NULL), |
| 338 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) | 338 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) |
| 339 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) | 339 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) |
| 340 reusable_handles_() { | 340 reusable_handles_() { |
| 341 set_vm_tag(VMTag::kVMTagId); | 341 set_vm_tag(VMTag::kIdleTagId); |
| 342 } | 342 } |
| 343 #undef REUSABLE_HANDLE_SCOPE_INIT | 343 #undef REUSABLE_HANDLE_SCOPE_INIT |
| 344 #undef REUSABLE_HANDLE_INITIALIZERS | 344 #undef REUSABLE_HANDLE_INITIALIZERS |
| 345 | 345 |
| 346 | 346 |
| 347 Isolate::~Isolate() { | 347 Isolate::~Isolate() { |
| 348 delete [] name_; | 348 delete [] name_; |
| 349 delete heap_; | 349 delete heap_; |
| 350 delete object_store_; | 350 delete object_store_; |
| 351 delete api_state_; | 351 delete api_state_; |
| 352 delete stub_code_; | 352 delete stub_code_; |
| 353 delete debugger_; | 353 delete debugger_; |
| 354 #if defined(USING_SIMULATOR) | 354 #if defined(USING_SIMULATOR) |
| 355 delete simulator_; | 355 delete simulator_; |
| 356 #endif | 356 #endif |
| 357 delete mutex_; | 357 delete mutex_; |
| 358 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. | 358 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. |
| 359 delete message_handler_; | 359 delete message_handler_; |
| 360 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. | 360 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. |
| 361 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. | 361 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. |
| 362 delete spawn_state_; | 362 delete spawn_state_; |
| 363 } | 363 } |
| 364 | 364 |
| 365 | 365 |
| 366 void Isolate::SetCurrent(Isolate* current) { | 366 void Isolate::SetCurrent(Isolate* current) { |
| 367 Isolate* old_current = Current(); | 367 Isolate* old_current = Current(); |
| 368 if (old_current != NULL) { | 368 if (old_current != NULL) { |
| 369 old_current->set_vm_tag(VMTag::kIdleTagId); |
| 369 old_current->set_thread_state(NULL); | 370 old_current->set_thread_state(NULL); |
| 370 Profiler::EndExecution(old_current); | 371 Profiler::EndExecution(old_current); |
| 371 } | 372 } |
| 372 Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current)); | 373 Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current)); |
| 373 if (current != NULL) { | 374 if (current != NULL) { |
| 374 ASSERT(current->thread_state() == NULL); | 375 ASSERT(current->thread_state() == NULL); |
| 375 InterruptableThreadState* thread_state = | 376 InterruptableThreadState* thread_state = |
| 376 ThreadInterrupter::GetCurrentThreadState(); | 377 ThreadInterrupter::GetCurrentThreadState(); |
| 377 #if defined(DEBUG) | 378 #if defined(DEBUG) |
| 378 CheckForDuplicateThreadState(thread_state); | 379 CheckForDuplicateThreadState(thread_state); |
| 379 #endif | 380 #endif |
| 380 Profiler::BeginExecution(current); | 381 Profiler::BeginExecution(current); |
| 381 current->set_thread_state(thread_state); | 382 current->set_thread_state(thread_state); |
| 383 current->set_vm_tag(VMTag::kVMTagId); |
| 382 } | 384 } |
| 383 } | 385 } |
| 384 | 386 |
| 385 | 387 |
| 386 // The single thread local key which stores all the thread local data | 388 // The single thread local key which stores all the thread local data |
| 387 // for a thread. Since an Isolate is the central repository for | 389 // for a thread. Since an Isolate is the central repository for |
| 388 // storing all isolate specific information a single thread local key | 390 // storing all isolate specific information a single thread local key |
| 389 // is sufficient. | 391 // is sufficient. |
| 390 ThreadLocalKey Isolate::isolate_key = Thread::kUnsetThreadLocalKey; | 392 ThreadLocalKey Isolate::isolate_key = Thread::kUnsetThreadLocalKey; |
| 391 | 393 |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 jsobj.AddProperty("controlPorts", control_ports); | 918 jsobj.AddProperty("controlPorts", control_ports); |
| 917 jsobj.AddProperty("pausedOnStart", pause_on_start); | 919 jsobj.AddProperty("pausedOnStart", pause_on_start); |
| 918 jsobj.AddProperty("pausedOnExit", paused_on_exit); | 920 jsobj.AddProperty("pausedOnExit", paused_on_exit); |
| 919 jsobj.AddProperty("pauseOnExit", pause_on_exit); | 921 jsobj.AddProperty("pauseOnExit", pause_on_exit); |
| 920 const Library& lib = | 922 const Library& lib = |
| 921 Library::Handle(object_store()->root_library()); | 923 Library::Handle(object_store()->root_library()); |
| 922 jsobj.AddProperty("rootLib", lib); | 924 jsobj.AddProperty("rootLib", lib); |
| 923 | 925 |
| 924 timer_list().PrintTimersToJSONProperty(&jsobj); | 926 timer_list().PrintTimersToJSONProperty(&jsobj); |
| 925 | 927 |
| 928 if (object_store()->sticky_error() != Object::null()) { |
| 929 Error& error = Error::Handle(this, object_store()->sticky_error()); |
| 930 ASSERT(!error.IsNull()); |
| 931 jsobj.AddProperty("error", error, false); |
| 932 } |
| 933 |
| 926 { | 934 { |
| 927 JSONObject typeargsRef(&jsobj, "canonicalTypeArguments"); | 935 JSONObject typeargsRef(&jsobj, "canonicalTypeArguments"); |
| 928 typeargsRef.AddProperty("type", "@TypeArgumentsList"); | 936 typeargsRef.AddProperty("type", "@TypeArgumentsList"); |
| 929 typeargsRef.AddProperty("id", "typearguments"); | 937 typeargsRef.AddProperty("id", "typearguments"); |
| 930 typeargsRef.AddProperty("name", "canonical type arguments"); | 938 typeargsRef.AddProperty("name", "canonical type arguments"); |
| 931 } | 939 } |
| 932 } | 940 } |
| 933 | 941 |
| 934 | 942 |
| 943 void Isolate::ProfileInterrupt() { |
| 944 InterruptableThreadState* state = thread_state(); |
| 945 if (state == NULL) { |
| 946 // Isolate is not scheduled on a thread. |
| 947 ProfileIdle(); |
| 948 return; |
| 949 } |
| 950 ASSERT(state->id != Thread::kInvalidThreadId); |
| 951 ThreadInterrupter::InterruptThread(state); |
| 952 } |
| 953 |
| 954 |
| 955 void Isolate::ProfileIdle() { |
| 956 vm_tag_counters_.Increment(vm_tag()); |
| 957 } |
| 958 |
| 959 |
| 935 void Isolate::VisitIsolates(IsolateVisitor* visitor) { | 960 void Isolate::VisitIsolates(IsolateVisitor* visitor) { |
| 936 if (visitor == NULL) { | 961 if (visitor == NULL) { |
| 937 return; | 962 return; |
| 938 } | 963 } |
| 939 MonitorLocker ml(isolates_list_monitor_); | 964 MonitorLocker ml(isolates_list_monitor_); |
| 940 Isolate* current = isolates_list_head_; | 965 Isolate* current = isolates_list_head_; |
| 941 while (current) { | 966 while (current) { |
| 942 visitor->VisitIsolate(current); | 967 visitor->VisitIsolate(current); |
| 943 current = current->next_; | 968 current = current->next_; |
| 944 } | 969 } |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1094 return func.raw(); | 1119 return func.raw(); |
| 1095 } | 1120 } |
| 1096 | 1121 |
| 1097 | 1122 |
| 1098 void IsolateSpawnState::Cleanup() { | 1123 void IsolateSpawnState::Cleanup() { |
| 1099 SwitchIsolateScope switch_scope(isolate()); | 1124 SwitchIsolateScope switch_scope(isolate()); |
| 1100 Dart::ShutdownIsolate(); | 1125 Dart::ShutdownIsolate(); |
| 1101 } | 1126 } |
| 1102 | 1127 |
| 1103 } // namespace dart | 1128 } // namespace dart |
| OLD | NEW |