| 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 "vm/code_observers.h" | 10 #include "vm/code_observers.h" |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 single_step_(false), | 409 single_step_(false), |
| 410 resume_request_(false), | 410 resume_request_(false), |
| 411 random_(), | 411 random_(), |
| 412 simulator_(NULL), | 412 simulator_(NULL), |
| 413 long_jump_base_(NULL), | 413 long_jump_base_(NULL), |
| 414 timer_list_(), | 414 timer_list_(), |
| 415 deopt_id_(0), | 415 deopt_id_(0), |
| 416 mutex_(new Mutex()), | 416 mutex_(new Mutex()), |
| 417 stack_limit_(0), | 417 stack_limit_(0), |
| 418 saved_stack_limit_(0), | 418 saved_stack_limit_(0), |
| 419 stack_base_(0), |
| 419 stack_overflow_flags_(0), | 420 stack_overflow_flags_(0), |
| 420 stack_overflow_count_(0), | 421 stack_overflow_count_(0), |
| 421 message_handler_(NULL), | 422 message_handler_(NULL), |
| 422 spawn_state_(NULL), | 423 spawn_state_(NULL), |
| 423 is_runnable_(false), | 424 is_runnable_(false), |
| 424 gc_prologue_callback_(NULL), | 425 gc_prologue_callback_(NULL), |
| 425 gc_epilogue_callback_(NULL), | 426 gc_epilogue_callback_(NULL), |
| 426 defer_finalization_count_(0), | 427 defer_finalization_count_(0), |
| 427 deopt_context_(NULL), | 428 deopt_context_(NULL), |
| 428 stacktrace_(NULL), | 429 stacktrace_(NULL), |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 | 595 |
| 595 // Setup the Dart API state. | 596 // Setup the Dart API state. |
| 596 ApiState* state = new ApiState(); | 597 ApiState* state = new ApiState(); |
| 597 ASSERT(state != NULL); | 598 ASSERT(state != NULL); |
| 598 result->set_api_state(state); | 599 result->set_api_state(state); |
| 599 | 600 |
| 600 // Initialize stack top and limit in case we are running the isolate in the | 601 // Initialize stack top and limit in case we are running the isolate in the |
| 601 // main thread. | 602 // main thread. |
| 602 // TODO(5411455): Need to figure out how to set the stack limit for the | 603 // TODO(5411455): Need to figure out how to set the stack limit for the |
| 603 // main thread. | 604 // main thread. |
| 604 result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result)); | 605 result->SetStackLimitFromStackBase(reinterpret_cast<uword>(&result)); |
| 605 result->set_main_port(PortMap::CreatePort(result->message_handler())); | 606 result->set_main_port(PortMap::CreatePort(result->message_handler())); |
| 606 result->set_pause_capability(result->random()->NextUInt64()); | 607 result->set_pause_capability(result->random()->NextUInt64()); |
| 607 result->set_terminate_capability(result->random()->NextUInt64()); | 608 result->set_terminate_capability(result->random()->NextUInt64()); |
| 608 | 609 |
| 609 result->BuildName(name_prefix); | 610 result->BuildName(name_prefix); |
| 610 | 611 |
| 611 result->debugger_ = new Debugger(); | 612 result->debugger_ = new Debugger(); |
| 612 result->debugger_->Initialize(result); | 613 result->debugger_->Initialize(result); |
| 613 if (FLAG_trace_isolates) { | 614 if (FLAG_trace_isolates) { |
| 614 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { | 615 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 635 | 636 |
| 636 // TODO(5411455): Use flag to override default value and Validate the | 637 // TODO(5411455): Use flag to override default value and Validate the |
| 637 // stack size by querying OS. | 638 // stack size by querying OS. |
| 638 uword Isolate::GetSpecifiedStackSize() { | 639 uword Isolate::GetSpecifiedStackSize() { |
| 639 ASSERT(Isolate::kStackSizeBuffer < Thread::GetMaxStackSize()); | 640 ASSERT(Isolate::kStackSizeBuffer < Thread::GetMaxStackSize()); |
| 640 uword stack_size = Thread::GetMaxStackSize() - Isolate::kStackSizeBuffer; | 641 uword stack_size = Thread::GetMaxStackSize() - Isolate::kStackSizeBuffer; |
| 641 return stack_size; | 642 return stack_size; |
| 642 } | 643 } |
| 643 | 644 |
| 644 | 645 |
| 645 void Isolate::SetStackLimitFromCurrentTOS(uword stack_top_value) { | 646 void Isolate::SetStackLimitFromStackBase(uword stack_base) { |
| 646 #if defined(USING_SIMULATOR) | 647 #if defined(USING_SIMULATOR) |
| 647 // Ignore passed-in native stack top and use Simulator stack top. | 648 // Ignore passed-in native stack top and use Simulator stack top. |
| 648 Simulator* sim = Simulator::Current(); // May allocate a simulator. | 649 Simulator* sim = Simulator::Current(); // May allocate a simulator. |
| 649 ASSERT(simulator() == sim); // This isolate's simulator is the current one. | 650 ASSERT(simulator() == sim); // This isolate's simulator is the current one. |
| 650 stack_top_value = sim->StackTop(); | 651 stack_base = sim->StackTop(); |
| 651 // The overflow area is accounted for by the simulator. | 652 // The overflow area is accounted for by the simulator. |
| 652 #endif | 653 #endif |
| 653 SetStackLimit(stack_top_value - GetSpecifiedStackSize()); | 654 // Set stack base. |
| 655 stack_base_ = stack_base; |
| 656 // Set stack limit. |
| 657 SetStackLimit(stack_base_ - GetSpecifiedStackSize()); |
| 654 } | 658 } |
| 655 | 659 |
| 656 | 660 |
| 657 void Isolate::SetStackLimit(uword limit) { | 661 void Isolate::SetStackLimit(uword limit) { |
| 658 // The isolate setting the stack limit is not necessarily the isolate which | 662 // The isolate setting the stack limit is not necessarily the isolate which |
| 659 // the stack limit is being set on. | 663 // the stack limit is being set on. |
| 660 MutexLocker ml(mutex_); | 664 MutexLocker ml(mutex_); |
| 661 if (stack_limit_ == saved_stack_limit_) { | 665 if (stack_limit_ == saved_stack_limit_) { |
| 662 // No interrupt pending, set stack_limit_ too. | 666 // No interrupt pending, set stack_limit_ too. |
| 663 stack_limit_ = limit; | 667 stack_limit_ = limit; |
| 664 } | 668 } |
| 665 saved_stack_limit_ = limit; | 669 saved_stack_limit_ = limit; |
| 666 } | 670 } |
| 667 | 671 |
| 668 | 672 |
| 669 bool Isolate::GetStackBounds(uword* lower, uword* upper) { | 673 void Isolate::ClearStackLimit() { |
| 674 SetStackLimit(~static_cast<uword>(0)); |
| 675 stack_base_ = 0; |
| 676 } |
| 677 |
| 678 |
| 679 bool Isolate::GetProfilerStackBounds(uword* lower, uword* upper) const { |
| 670 uword stack_lower = stack_limit(); | 680 uword stack_lower = stack_limit(); |
| 671 if (stack_lower == kUwordMax) { | 681 if (stack_lower == kUwordMax) { |
| 672 stack_lower = saved_stack_limit(); | 682 stack_lower = saved_stack_limit(); |
| 673 } | 683 } |
| 674 if (stack_lower == kUwordMax) { | 684 if (stack_lower == kUwordMax) { |
| 675 return false; | 685 return false; |
| 676 } | 686 } |
| 677 uword stack_upper = stack_lower + GetSpecifiedStackSize(); | 687 uword stack_upper = stack_lower + GetSpecifiedStackSize(); |
| 678 *lower = stack_lower; | 688 *lower = stack_lower; |
| 679 *upper = stack_upper; | 689 *upper = stack_upper; |
| (...skipping 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1532 serialized_message_, serialized_message_len_); | 1542 serialized_message_, serialized_message_len_); |
| 1533 } | 1543 } |
| 1534 | 1544 |
| 1535 | 1545 |
| 1536 void IsolateSpawnState::Cleanup() { | 1546 void IsolateSpawnState::Cleanup() { |
| 1537 SwitchIsolateScope switch_scope(I); | 1547 SwitchIsolateScope switch_scope(I); |
| 1538 Dart::ShutdownIsolate(); | 1548 Dart::ShutdownIsolate(); |
| 1539 } | 1549 } |
| 1540 | 1550 |
| 1541 } // namespace dart | 1551 } // namespace dart |
| OLD | NEW |