| 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 // Allow the embedder to handle message notification. | 97 // Allow the embedder to handle message notification. |
| 98 (*callback)(Api::CastIsolate(isolate_)); | 98 (*callback)(Api::CastIsolate(isolate_)); |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 | 101 |
| 102 | 102 |
| 103 bool IsolateMessageHandler::HandleMessage(Message* message) { | 103 bool IsolateMessageHandler::HandleMessage(Message* message) { |
| 104 StartIsolateScope start_scope(isolate_); | 104 StartIsolateScope start_scope(isolate_); |
| 105 StackZone zone(isolate_); | 105 StackZone zone(isolate_); |
| 106 HandleScope handle_scope(isolate_); | 106 HandleScope handle_scope(isolate_); |
| 107 // TODO(turnidge): Rework collection total dart execution. This can |
| 108 // overcount when other things (gc, compilation) are active. |
| 109 TIMERSCOPE(time_dart_execution); |
| 107 | 110 |
| 108 // If the message is in band we lookup the receive port to dispatch to. If | 111 // If the message is in band we lookup the receive port to dispatch to. If |
| 109 // the receive port is closed, we drop the message without deserializing it. | 112 // the receive port is closed, we drop the message without deserializing it. |
| 110 Object& receive_port = Object::Handle(); | 113 Object& receive_port = Object::Handle(); |
| 111 if (!message->IsOOB()) { | 114 if (!message->IsOOB()) { |
| 112 receive_port = DartLibraryCalls::LookupReceivePort(message->dest_port()); | 115 receive_port = DartLibraryCalls::LookupReceivePort(message->dest_port()); |
| 113 if (receive_port.IsError()) { | 116 if (receive_port.IsError()) { |
| 114 return ProcessUnhandledException(Object::null_instance(), | 117 return ProcessUnhandledException(Object::null_instance(), |
| 115 Error::Cast(receive_port)); | 118 Error::Cast(receive_port)); |
| 116 } | 119 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 single_step_(false), | 296 single_step_(false), |
| 294 random_(), | 297 random_(), |
| 295 simulator_(NULL), | 298 simulator_(NULL), |
| 296 long_jump_base_(NULL), | 299 long_jump_base_(NULL), |
| 297 timer_list_(), | 300 timer_list_(), |
| 298 deopt_id_(0), | 301 deopt_id_(0), |
| 299 mutex_(new Mutex()), | 302 mutex_(new Mutex()), |
| 300 stack_limit_(0), | 303 stack_limit_(0), |
| 301 saved_stack_limit_(0), | 304 saved_stack_limit_(0), |
| 302 message_handler_(NULL), | 305 message_handler_(NULL), |
| 303 spawn_data_(0), | 306 spawn_state_(NULL), |
| 304 is_runnable_(false), | 307 is_runnable_(false), |
| 305 gc_prologue_callbacks_(), | 308 gc_prologue_callbacks_(), |
| 306 gc_epilogue_callbacks_(), | 309 gc_epilogue_callbacks_(), |
| 307 defer_finalization_count_(0), | 310 defer_finalization_count_(0), |
| 308 deopt_context_(NULL), | 311 deopt_context_(NULL), |
| 309 stacktrace_(NULL), | 312 stacktrace_(NULL), |
| 310 stack_frame_index_(-1), | 313 stack_frame_index_(-1), |
| 311 object_histogram_(NULL), | 314 object_histogram_(NULL), |
| 312 object_id_ring_(NULL), | 315 object_id_ring_(NULL), |
| 313 profiler_data_(NULL), | 316 profiler_data_(NULL), |
| (...skipping 15 matching lines...) Expand all Loading... |
| 329 delete debugger_; | 332 delete debugger_; |
| 330 #if defined(USING_SIMULATOR) | 333 #if defined(USING_SIMULATOR) |
| 331 delete simulator_; | 334 delete simulator_; |
| 332 #endif | 335 #endif |
| 333 delete mutex_; | 336 delete mutex_; |
| 334 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. | 337 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. |
| 335 delete message_handler_; | 338 delete message_handler_; |
| 336 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. | 339 message_handler_ = NULL; // Fail fast if we send messages to a dead isolate. |
| 337 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. | 340 ASSERT(deopt_context_ == NULL); // No deopt in progress when isolate deleted. |
| 338 delete object_histogram_; | 341 delete object_histogram_; |
| 342 delete spawn_state_; |
| 339 } | 343 } |
| 340 | 344 |
| 341 void Isolate::SetCurrent(Isolate* current) { | 345 void Isolate::SetCurrent(Isolate* current) { |
| 342 Isolate* old_current = Current(); | 346 Isolate* old_current = Current(); |
| 343 if (old_current != current) { | 347 if (old_current != current) { |
| 344 Profiler::EndExecution(old_current); | 348 Profiler::EndExecution(old_current); |
| 345 Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current)); | 349 Thread::SetThreadLocal(isolate_key, reinterpret_cast<uword>(current)); |
| 346 Profiler::BeginExecution(current); | 350 Profiler::BeginExecution(current); |
| 347 } | 351 } |
| 348 } | 352 } |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 // a StackResource, which requires a current isolate. | 495 // a StackResource, which requires a current isolate. |
| 492 mutex_->Lock(); | 496 mutex_->Lock(); |
| 493 // Check if we are in a valid state to make the isolate runnable. | 497 // Check if we are in a valid state to make the isolate runnable. |
| 494 if (is_runnable_ == true) { | 498 if (is_runnable_ == true) { |
| 495 mutex_->Unlock(); | 499 mutex_->Unlock(); |
| 496 return false; // Already runnable. | 500 return false; // Already runnable. |
| 497 } | 501 } |
| 498 // Set the isolate as runnable and if we are being spawned schedule | 502 // Set the isolate as runnable and if we are being spawned schedule |
| 499 // isolate on thread pool for execution. | 503 // isolate on thread pool for execution. |
| 500 is_runnable_ = true; | 504 is_runnable_ = true; |
| 501 IsolateSpawnState* state = reinterpret_cast<IsolateSpawnState*>(spawn_data()); | 505 IsolateSpawnState* state = spawn_state(); |
| 502 if (state != NULL) { | 506 if (state != NULL) { |
| 503 ASSERT(this == state->isolate()); | 507 ASSERT(this == state->isolate()); |
| 504 Run(); | 508 Run(); |
| 505 } | 509 } |
| 506 mutex_->Unlock(); | 510 mutex_->Unlock(); |
| 507 return true; | 511 return true; |
| 508 } | 512 } |
| 509 | 513 |
| 510 | 514 |
| 511 static void StoreError(Isolate* isolate, const Object& obj) { | 515 static void StoreError(Isolate* isolate, const Object& obj) { |
| 512 ASSERT(obj.IsError()); | 516 ASSERT(obj.IsError()); |
| 513 isolate->object_store()->set_sticky_error(Error::Cast(obj)); | 517 isolate->object_store()->set_sticky_error(Error::Cast(obj)); |
| 514 } | 518 } |
| 515 | 519 |
| 516 | 520 |
| 517 static bool RunIsolate(uword parameter) { | 521 static bool RunIsolate(uword parameter) { |
| 518 Isolate* isolate = reinterpret_cast<Isolate*>(parameter); | 522 Isolate* isolate = reinterpret_cast<Isolate*>(parameter); |
| 519 IsolateSpawnState* state = NULL; | 523 IsolateSpawnState* state = NULL; |
| 520 { | 524 { |
| 525 // TODO(turnidge): Is this locking required here at all anymore? |
| 521 MutexLocker ml(isolate->mutex()); | 526 MutexLocker ml(isolate->mutex()); |
| 522 state = reinterpret_cast<IsolateSpawnState*>(isolate->spawn_data()); | 527 state = isolate->spawn_state(); |
| 523 isolate->set_spawn_data(0); | |
| 524 } | 528 } |
| 525 { | 529 { |
| 526 StartIsolateScope start_scope(isolate); | 530 StartIsolateScope start_scope(isolate); |
| 527 StackZone zone(isolate); | 531 StackZone zone(isolate); |
| 528 HandleScope handle_scope(isolate); | 532 HandleScope handle_scope(isolate); |
| 529 if (!ClassFinalizer::ProcessPendingClasses()) { | 533 if (!ClassFinalizer::ProcessPendingClasses()) { |
| 530 // Error is in sticky error already. | 534 // Error is in sticky error already. |
| 531 return false; | 535 return false; |
| 532 } | 536 } |
| 533 | 537 |
| 534 // Set up specific unhandled exception handler. | 538 // Set up specific unhandled exception handler. |
| 535 const String& callback_name = String::Handle( | 539 const String& callback_name = String::Handle( |
| 536 isolate, String::New(state->exception_callback_name())); | 540 isolate, String::New(state->exception_callback_name())); |
| 537 isolate->object_store()-> | 541 isolate->object_store()-> |
| 538 set_unhandled_exception_handler(callback_name); | 542 set_unhandled_exception_handler(callback_name); |
| 539 | 543 |
| 540 Object& result = Object::Handle(); | 544 Object& result = Object::Handle(); |
| 541 result = state->ResolveFunction(); | 545 result = state->ResolveFunction(); |
| 542 bool is_spawn_uri = state->is_spawn_uri(); | 546 bool is_spawn_uri = state->is_spawn_uri(); |
| 543 delete state; | |
| 544 state = NULL; | |
| 545 if (result.IsError()) { | 547 if (result.IsError()) { |
| 546 StoreError(isolate, result); | 548 StoreError(isolate, result); |
| 547 return false; | 549 return false; |
| 548 } | 550 } |
| 549 ASSERT(result.IsFunction()); | 551 ASSERT(result.IsFunction()); |
| 550 Function& func = Function::Handle(isolate); | 552 Function& func = Function::Handle(isolate); |
| 551 func ^= result.raw(); | 553 func ^= result.raw(); |
| 552 func = func.ImplicitClosureFunction(); | 554 func = func.ImplicitClosureFunction(); |
| 553 | 555 |
| 554 // Instead of directly invoking the entry point we call '_startIsolate' with | 556 // Instead of directly invoking the entry point we call '_startIsolate' with |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1121 return func.raw(); | 1123 return func.raw(); |
| 1122 } | 1124 } |
| 1123 | 1125 |
| 1124 | 1126 |
| 1125 void IsolateSpawnState::Cleanup() { | 1127 void IsolateSpawnState::Cleanup() { |
| 1126 SwitchIsolateScope switch_scope(isolate()); | 1128 SwitchIsolateScope switch_scope(isolate()); |
| 1127 Dart::ShutdownIsolate(); | 1129 Dart::ShutdownIsolate(); |
| 1128 } | 1130 } |
| 1129 | 1131 |
| 1130 } // namespace dart | 1132 } // namespace dart |
| OLD | NEW |