Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(225)

Side by Side Diff: runtime/vm/isolate.cc

Issue 1007863003: Allow Observatory debugger to switch isolates. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/json_stream.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 534
535 #define REUSABLE_HANDLE_INITIALIZERS(object) \ 535 #define REUSABLE_HANDLE_INITIALIZERS(object) \
536 object##_handle_(NULL), 536 object##_handle_(NULL),
537 537
538 Isolate::Isolate() 538 Isolate::Isolate()
539 : mutator_thread_(new Thread(this)), 539 : mutator_thread_(new Thread(this)),
540 vm_tag_(0), 540 vm_tag_(0),
541 store_buffer_(), 541 store_buffer_(),
542 message_notify_callback_(NULL), 542 message_notify_callback_(NULL),
543 name_(NULL), 543 name_(NULL),
544 debugger_name_(NULL),
544 start_time_(OS::GetCurrentTimeMicros()), 545 start_time_(OS::GetCurrentTimeMicros()),
545 main_port_(0), 546 main_port_(0),
546 origin_id_(0), 547 origin_id_(0),
547 pause_capability_(0), 548 pause_capability_(0),
548 terminate_capability_(0), 549 terminate_capability_(0),
549 errors_fatal_(true), 550 errors_fatal_(true),
550 heap_(NULL), 551 heap_(NULL),
551 object_store_(NULL), 552 object_store_(NULL),
552 top_exit_frame_info_(0), 553 top_exit_frame_info_(0),
553 init_callback_data_(NULL), 554 init_callback_data_(NULL),
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 set_user_tag(UserTags::kDefaultUserTag); 603 set_user_tag(UserTags::kDefaultUserTag);
603 } 604 }
604 605
605 Isolate::Isolate(Isolate* original) 606 Isolate::Isolate(Isolate* original)
606 : mutator_thread_(new Thread(this)), 607 : mutator_thread_(new Thread(this)),
607 vm_tag_(0), 608 vm_tag_(0),
608 store_buffer_(true), 609 store_buffer_(true),
609 class_table_(original->class_table()), 610 class_table_(original->class_table()),
610 message_notify_callback_(NULL), 611 message_notify_callback_(NULL),
611 name_(NULL), 612 name_(NULL),
613 debugger_name_(NULL),
612 start_time_(OS::GetCurrentTimeMicros()), 614 start_time_(OS::GetCurrentTimeMicros()),
613 main_port_(0), 615 main_port_(0),
614 pause_capability_(0), 616 pause_capability_(0),
615 terminate_capability_(0), 617 terminate_capability_(0),
616 errors_fatal_(true), 618 errors_fatal_(true),
617 heap_(NULL), 619 heap_(NULL),
618 object_store_(NULL), 620 object_store_(NULL),
619 top_exit_frame_info_(0), 621 top_exit_frame_info_(0),
620 init_callback_data_(NULL), 622 init_callback_data_(NULL),
621 environment_callback_(NULL), 623 environment_callback_(NULL),
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 next_(NULL), 661 next_(NULL),
660 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS) 662 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
661 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT) 663 REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
662 reusable_handles_() { 664 reusable_handles_() {
663 } 665 }
664 #undef REUSABLE_HANDLE_SCOPE_INIT 666 #undef REUSABLE_HANDLE_SCOPE_INIT
665 #undef REUSABLE_HANDLE_INITIALIZERS 667 #undef REUSABLE_HANDLE_INITIALIZERS
666 668
667 Isolate::~Isolate() { 669 Isolate::~Isolate() {
668 free(name_); 670 free(name_);
671 free(debugger_name_);
669 delete heap_; 672 delete heap_;
670 delete object_store_; 673 delete object_store_;
671 delete api_state_; 674 delete api_state_;
672 delete stub_code_; 675 delete stub_code_;
673 delete debugger_; 676 delete debugger_;
674 #if defined(USING_SIMULATOR) 677 #if defined(USING_SIMULATOR)
675 delete simulator_; 678 delete simulator_;
676 #endif 679 #endif
677 delete mutex_; 680 delete mutex_;
678 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate. 681 mutex_ = NULL; // Fail fast if interrupts are scheduled on a dead isolate.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 #if defined(DEBUG) 767 #if defined(DEBUG)
765 // Verify that we are never reusing a live origin id. 768 // Verify that we are never reusing a live origin id.
766 VerifyOriginId id_verifier(result->main_port()); 769 VerifyOriginId id_verifier(result->main_port());
767 Isolate::VisitIsolates(&id_verifier); 770 Isolate::VisitIsolates(&id_verifier);
768 #endif 771 #endif
769 result->set_origin_id(result->main_port()); 772 result->set_origin_id(result->main_port());
770 result->set_pause_capability(result->random()->NextUInt64()); 773 result->set_pause_capability(result->random()->NextUInt64());
771 result->set_terminate_capability(result->random()->NextUInt64()); 774 result->set_terminate_capability(result->random()->NextUInt64());
772 775
773 result->BuildName(name_prefix); 776 result->BuildName(name_prefix);
774
775 result->debugger_ = new Debugger(); 777 result->debugger_ = new Debugger();
776 result->debugger_->Initialize(result); 778 result->debugger_->Initialize(result);
777 if (FLAG_trace_isolates) { 779 if (FLAG_trace_isolates) {
778 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) { 780 if (name_prefix == NULL || strcmp(name_prefix, "vm-isolate") != 0) {
779 OS::Print("[+] Starting isolate:\n" 781 OS::Print("[+] Starting isolate:\n"
780 "\tisolate: %s\n", result->name()); 782 "\tisolate: %s\n", result->name());
781 } 783 }
782 } 784 }
783 785
784 // Add to isolate list. 786 // Add to isolate list.
(...skipping 23 matching lines...) Expand all
808 uword stack_allocated_local_address = reinterpret_cast<uword>(&func); 810 uword stack_allocated_local_address = reinterpret_cast<uword>(&func);
809 return stack_allocated_local_address; 811 return stack_allocated_local_address;
810 #endif 812 #endif
811 #else 813 #else
812 uword stack_allocated_local_address = reinterpret_cast<uword>(&func); 814 uword stack_allocated_local_address = reinterpret_cast<uword>(&func);
813 return stack_allocated_local_address; 815 return stack_allocated_local_address;
814 #endif 816 #endif
815 } 817 }
816 818
817 819
820 void Isolate::set_debugger_name(const char* name) {
821 free(debugger_name_);
822 debugger_name_ = strdup(name);
823 }
824
825
818 void Isolate::BuildName(const char* name_prefix) { 826 void Isolate::BuildName(const char* name_prefix) {
819 ASSERT(name_ == NULL); 827 ASSERT(name_ == NULL);
820 if (name_prefix == NULL) { 828 if (name_prefix == NULL) {
821 name_prefix = "isolate"; 829 name_prefix = "isolate";
822 } 830 }
831 set_debugger_name(name_prefix);
823 if (ServiceIsolate::NameEquals(name_prefix)) { 832 if (ServiceIsolate::NameEquals(name_prefix)) {
824 name_ = strdup(name_prefix); 833 name_ = strdup(name_prefix);
825 return; 834 return;
826 } 835 }
827 const char* kFormat = "%s-%lld"; 836 const char* kFormat = "%s-%lld";
828 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name_prefix, main_port()) + 1; 837 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name_prefix, main_port()) + 1;
829 name_ = reinterpret_cast<char*>(malloc(len)); 838 name_ = reinterpret_cast<char*>(malloc(len));
830 OS::SNPrint(name_, len, kFormat, name_prefix, main_port()); 839 OS::SNPrint(name_, len, kFormat, name_prefix, main_port());
831 } 840 }
832 841
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 // as 'load in progres'. Set the status to 'loaded'. 933 // as 'load in progres'. Set the status to 'loaded'.
925 if (lib.LoadInProgress()) { 934 if (lib.LoadInProgress()) {
926 lib.SetLoaded(); 935 lib.SetLoaded();
927 } 936 }
928 } 937 }
929 } 938 }
930 939
931 940
932 bool Isolate::MakeRunnable() { 941 bool Isolate::MakeRunnable() {
933 ASSERT(Isolate::Current() == NULL); 942 ASSERT(Isolate::Current() == NULL);
943
934 MutexLocker ml(mutex_); 944 MutexLocker ml(mutex_);
935 // Check if we are in a valid state to make the isolate runnable. 945 // Check if we are in a valid state to make the isolate runnable.
936 if (is_runnable_ == true) { 946 if (is_runnable_ == true) {
937 return false; // Already runnable. 947 return false; // Already runnable.
938 } 948 }
939 // Set the isolate as runnable and if we are being spawned schedule 949 // Set the isolate as runnable and if we are being spawned schedule
940 // isolate on thread pool for execution. 950 // isolate on thread pool for execution.
941 is_runnable_ = true; 951 is_runnable_ = true;
942 if (!ServiceIsolate::IsServiceIsolate(this)) { 952 if (!ServiceIsolate::IsServiceIsolate(this)) {
943 message_handler()->set_pause_on_start(FLAG_pause_isolates_on_start); 953 message_handler()->set_pause_on_start(FLAG_pause_isolates_on_start);
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 api_state()->VisitPrologueWeakHandles(visitor); 1538 api_state()->VisitPrologueWeakHandles(visitor);
1529 } 1539 }
1530 } 1540 }
1531 1541
1532 1542
1533 void Isolate::PrintJSON(JSONStream* stream, bool ref) { 1543 void Isolate::PrintJSON(JSONStream* stream, bool ref) {
1534 JSONObject jsobj(stream); 1544 JSONObject jsobj(stream);
1535 jsobj.AddProperty("type", (ref ? "@Isolate" : "Isolate")); 1545 jsobj.AddProperty("type", (ref ? "@Isolate" : "Isolate"));
1536 jsobj.AddPropertyF("id", "isolates/%" Pd "", 1546 jsobj.AddPropertyF("id", "isolates/%" Pd "",
1537 static_cast<intptr_t>(main_port())); 1547 static_cast<intptr_t>(main_port()));
1538 jsobj.AddPropertyF("mainPort", "%" Pd "", 1548
1549 jsobj.AddProperty("name", debugger_name());
1550 jsobj.AddPropertyF("number", "%" Pd "",
1539 static_cast<intptr_t>(main_port())); 1551 static_cast<intptr_t>(main_port()));
1540
1541 // Assign an isolate name based on the entry function.
1542 IsolateSpawnState* state = spawn_state();
1543 if (state == NULL) {
1544 jsobj.AddPropertyF("name", "root");
1545 } else if (state->class_name() != NULL) {
1546 jsobj.AddPropertyF("name", "%s.%s",
1547 state->class_name(),
1548 state->function_name());
1549 } else {
1550 jsobj.AddPropertyF("name", "%s", state->function_name());
1551 }
1552 if (ref) { 1552 if (ref) {
1553 return; 1553 return;
1554 } 1554 }
1555 int64_t start_time_millis = start_time() / kMicrosecondsPerMillisecond;
1556 jsobj.AddProperty64("startTime", start_time_millis);
1557 IsolateSpawnState* state = spawn_state();
1555 if (state != NULL) { 1558 if (state != NULL) {
1556 const Object& entry = Object::Handle(this, state->ResolveFunction()); 1559 const Object& entry = Object::Handle(this, state->ResolveFunction());
1557 if (!entry.IsNull() && entry.IsFunction()) { 1560 if (!entry.IsNull() && entry.IsFunction()) {
1558 Function& func = Function::Handle(this); 1561 Function& func = Function::Handle(this);
1559 func ^= entry.raw(); 1562 func ^= entry.raw();
1560 jsobj.AddProperty("entry", func); 1563 jsobj.AddProperty("entry", func);
1561 } 1564 }
1562 } 1565 }
1563 { 1566 {
1564 JSONObject jsheap(&jsobj, "heaps"); 1567 JSONObject jsheap(&jsobj, "heaps");
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
1976 serialized_message_, serialized_message_len_); 1979 serialized_message_, serialized_message_len_);
1977 } 1980 }
1978 1981
1979 1982
1980 void IsolateSpawnState::Cleanup() { 1983 void IsolateSpawnState::Cleanup() {
1981 SwitchIsolateScope switch_scope(I); 1984 SwitchIsolateScope switch_scope(I);
1982 Dart::ShutdownIsolate(); 1985 Dart::ShutdownIsolate();
1983 } 1986 }
1984 1987
1985 } // namespace dart 1988 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/isolate.h ('k') | runtime/vm/json_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698