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

Side by Side Diff: runtime/bin/main.cc

Issue 889443002: Service isolate rework take 2 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 10 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/bin/io_impl_sources.gypi ('k') | runtime/bin/platform.h » ('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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 <stdlib.h> 5 #include <stdlib.h>
6 #include <string.h> 6 #include <string.h>
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include "include/dart_api.h" 9 #include "include/dart_api.h"
10 #include "include/dart_debugger_api.h" 10 #include "include/dart_debugger_api.h"
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 539
540 #define CHECK_RESULT(result) \ 540 #define CHECK_RESULT(result) \
541 if (Dart_IsError(result)) { \ 541 if (Dart_IsError(result)) { \
542 *error = strdup(Dart_GetError(result)); \ 542 *error = strdup(Dart_GetError(result)); \
543 *is_compile_error = Dart_IsCompilationError(result); \ 543 *is_compile_error = Dart_IsCompilationError(result); \
544 Dart_ExitScope(); \ 544 Dart_ExitScope(); \
545 Dart_ShutdownIsolate(); \ 545 Dart_ShutdownIsolate(); \
546 return NULL; \ 546 return NULL; \
547 } \ 547 } \
548 548
549
549 // Returns true on success, false on failure. 550 // Returns true on success, false on failure.
550 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri, 551 static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
551 const char* main, 552 const char* main,
552 const char* package_root, 553 const char* package_root,
553 char** error, 554 char** error,
554 bool* is_compile_error) { 555 bool* is_compile_error) {
555 ASSERT(script_uri != NULL); 556 ASSERT(script_uri != NULL);
556 IsolateData* isolate_data = new IsolateData(script_uri, package_root); 557 IsolateData* isolate_data = new IsolateData(script_uri, package_root);
557 Dart_Isolate isolate = Dart_CreateIsolate( 558 Dart_Isolate isolate = NULL;
558 script_uri, main, snapshot_buffer, isolate_data, error); 559
560 isolate = Dart_CreateIsolate(script_uri,
561 main,
562 snapshot_buffer,
563 isolate_data,
564 error);
565
559 if (isolate == NULL) { 566 if (isolate == NULL) {
560 return NULL; 567 return NULL;
561 } 568 }
562 569
563 Dart_EnterScope(); 570 Dart_EnterScope();
564 571
565 if (snapshot_buffer != NULL) { 572 if (snapshot_buffer != NULL) {
566 // Setup the native resolver as the snapshot does not carry it. 573 // Setup the native resolver as the snapshot does not carry it.
567 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); 574 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
568 Builtin::SetNativeResolver(Builtin::kIOLibrary); 575 Builtin::SetNativeResolver(Builtin::kIOLibrary);
569 } 576 }
570 577
578 if (Dart_IsServiceIsolate(isolate)) {
579 // If this is the service isolate, load embedder specific bits and return.
580 if (!VmService::Setup(vm_service_server_ip, vm_service_server_port)) {
581 *error = strdup(VmService::GetErrorMessage());
582 return NULL;
583 }
584 Dart_ExitScope();
585 Dart_ExitIsolate();
586 return isolate;
587 }
588
589 // Load the specified application script into the newly created isolate.
590
571 // Set up the library tag handler for this isolate. 591 // Set up the library tag handler for this isolate.
572 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler); 592 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
573 CHECK_RESULT(result); 593 CHECK_RESULT(result);
574 594
575 result = Dart_SetEnvironmentCallback(EnvironmentCallback);
576 CHECK_RESULT(result);
577
578 // Load the specified application script into the newly created isolate.
579
580 // Prepare builtin and its dependent libraries for use to resolve URIs. 595 // Prepare builtin and its dependent libraries for use to resolve URIs.
581 // The builtin library is part of the core snapshot and would already be 596 // The builtin library is part of the core snapshot and would already be
582 // available here in the case of script snapshot loading. 597 // available here in the case of script snapshot loading.
583 Dart_Handle builtin_lib = 598 Dart_Handle builtin_lib =
584 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary); 599 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
585 CHECK_RESULT(builtin_lib); 600 CHECK_RESULT(builtin_lib);
586 601
587 // Prepare for script loading by setting up the 'print' and 'timer' 602 // Prepare for script loading by setting up the 'print' and 'timer'
588 // closures and setting up 'package root' for URI resolution. 603 // closures and setting up 'package root' for URI resolution.
589 result = DartUtils::PrepareForScriptLoading(package_root, builtin_lib); 604 result = DartUtils::PrepareForScriptLoading(package_root, false, builtin_lib);
590 CHECK_RESULT(result); 605 CHECK_RESULT(result);
591 606
607 result = Dart_SetEnvironmentCallback(EnvironmentCallback);
608 CHECK_RESULT(result);
609
610 // Load the script.
592 result = DartUtils::LoadScript(script_uri, builtin_lib); 611 result = DartUtils::LoadScript(script_uri, builtin_lib);
593 CHECK_RESULT(result); 612 CHECK_RESULT(result);
594 613
595 // Run event-loop and wait for script loading to complete. 614 // Run event-loop and wait for script loading to complete.
596 result = Dart_RunLoop(); 615 result = Dart_RunLoop();
597 CHECK_RESULT(result); 616 CHECK_RESULT(result);
598 617
599 Platform::SetPackageRoot(package_root); 618 Platform::SetPackageRoot(package_root);
600 Dart_Handle io_lib_url = DartUtils::NewString(DartUtils::kIOLibURL); 619
601 CHECK_RESULT(io_lib_url); 620 DartUtils::SetupIOLibrary(script_uri);
602 Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
603 CHECK_RESULT(io_lib);
604 Dart_Handle platform_type = DartUtils::GetDartType(DartUtils::kIOLibURL,
605 "_Platform");
606 CHECK_RESULT(platform_type);
607 Dart_Handle script_name = DartUtils::NewString("_nativeScript");
608 CHECK_RESULT(script_name);
609 Dart_Handle dart_script = DartUtils::NewString(script_uri);
610 CHECK_RESULT(dart_script);
611 Dart_Handle set_script_name =
612 Dart_SetField(platform_type, script_name, dart_script);
613 CHECK_RESULT(set_script_name);
614 621
615 // Make the isolate runnable so that it is ready to handle messages. 622 // Make the isolate runnable so that it is ready to handle messages.
616 Dart_ExitScope(); 623 Dart_ExitScope();
617 Dart_ExitIsolate(); 624 Dart_ExitIsolate();
618 bool retval = Dart_IsolateMakeRunnable(isolate); 625 bool retval = Dart_IsolateMakeRunnable(isolate);
619 if (!retval) { 626 if (!retval) {
620 *error = strdup("Invalid isolate state - Unable to make it runnable"); 627 *error = strdup("Invalid isolate state - Unable to make it runnable");
621 Dart_EnterIsolate(isolate); 628 Dart_EnterIsolate(isolate);
622 Dart_ShutdownIsolate(); 629 Dart_ShutdownIsolate();
623 return NULL; 630 return NULL;
(...skipping 15 matching lines...) Expand all
639 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate"); 646 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate");
640 return NULL; 647 return NULL;
641 } 648 }
642 script_uri = parent_isolate_data->script_url; 649 script_uri = parent_isolate_data->script_url;
643 if (script_uri == NULL) { 650 if (script_uri == NULL) {
644 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate"); 651 *error = strdup("Invalid 'callback_data' - Unable to spawn new isolate");
645 return NULL; 652 return NULL;
646 } 653 }
647 } 654 }
648 if (package_root == NULL) { 655 if (package_root == NULL) {
649 package_root = parent_isolate_data->package_root; 656 if (parent_isolate_data != NULL) {
657 package_root = parent_isolate_data->package_root;
658 } else {
659 package_root = ".";
660 }
650 } 661 }
651 return CreateIsolateAndSetupHelper(script_uri, 662 return CreateIsolateAndSetupHelper(script_uri,
652 main, 663 main,
653 package_root, 664 package_root,
654 error, 665 error,
655 &is_compile_error); 666 &is_compile_error);
656 } 667 }
657 668
658 669
659 #define CHECK_RESULT(result) \
660 if (Dart_IsError(result)) { \
661 *error = strdup(Dart_GetError(result)); \
662 Dart_ExitScope(); \
663 Dart_ShutdownIsolate(); \
664 return NULL; \
665 } \
666
667 static Dart_Isolate CreateServiceIsolate(void* data, char** error) {
668 const char* script_uri = DartUtils::kVMServiceLibURL;
669 IsolateData* isolate_data = new IsolateData(script_uri, NULL);
670 Dart_Isolate isolate =
671 Dart_CreateIsolate(script_uri, "main", snapshot_buffer, isolate_data,
672 error);
673 if (isolate == NULL) {
674 return NULL;
675 }
676 Dart_EnterScope();
677 if (snapshot_buffer != NULL) {
678 // Setup the native resolver as the snapshot does not carry it.
679 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
680 Builtin::SetNativeResolver(Builtin::kIOLibrary);
681 }
682 // Set up the library tag handler for this isolate.
683 Dart_Handle result = Dart_SetLibraryTagHandler(DartUtils::LibraryTagHandler);
684 CHECK_RESULT(result);
685 result = Dart_SetEnvironmentCallback(EnvironmentCallback);
686 CHECK_RESULT(result);
687 // Prepare builtin and its dependent libraries for use to resolve URIs.
688 Dart_Handle builtin_lib =
689 Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
690 CHECK_RESULT(builtin_lib);
691 // Prepare for script loading by setting up the 'print' and 'timer'
692 // closures and setting up 'package root' for URI resolution.
693 result = DartUtils::PrepareForScriptLoading(NULL, builtin_lib);
694 CHECK_RESULT(result);
695
696 Dart_ExitScope();
697 Dart_ExitIsolate();
698 return isolate;
699 }
700
701 #undef CHECK_RESULT
702
703 static void PrintVersion() { 670 static void PrintVersion() {
704 Log::PrintErr("Dart VM version: %s\n", Dart_VersionString()); 671 Log::PrintErr("Dart VM version: %s\n", Dart_VersionString());
705 } 672 }
706 673
707 674
708 static void PrintUsage() { 675 static void PrintUsage() {
709 Log::PrintErr( 676 Log::PrintErr(
710 "Usage: dart [<vm-flags>] <dart-script-file> [<dart-options>]\n" 677 "Usage: dart [<vm-flags>] <dart-script-file> [<dart-options>]\n"
711 "\n" 678 "\n"
712 "Executes the Dart script passed as <dart-script-file>.\n" 679 "Executes the Dart script passed as <dart-script-file>.\n"
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 940
974 if (!DartUtils::SetOriginalWorkingDirectory()) { 941 if (!DartUtils::SetOriginalWorkingDirectory()) {
975 OSError err; 942 OSError err;
976 fprintf(stderr, "Error determining current directory: %s\n", err.message()); 943 fprintf(stderr, "Error determining current directory: %s\n", err.message());
977 fflush(stderr); 944 fflush(stderr);
978 exit(kErrorExitCode); 945 exit(kErrorExitCode);
979 } 946 }
980 947
981 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); 948 Dart_SetVMFlags(vm_options.count(), vm_options.arguments());
982 949
950 // Start event handler.
951 EventHandler::Start();
952
983 // Initialize the Dart VM. 953 // Initialize the Dart VM.
984 if (!Dart_Initialize(CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate, 954 if (!Dart_Initialize(CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate,
985 DartUtils::OpenFile, 955 DartUtils::OpenFile,
986 DartUtils::ReadFile, 956 DartUtils::ReadFile,
987 DartUtils::WriteFile, 957 DartUtils::WriteFile,
988 DartUtils::CloseFile, 958 DartUtils::CloseFile,
989 DartUtils::EntropySource, 959 DartUtils::EntropySource)) {
990 CreateServiceIsolate)) {
991 fprintf(stderr, "%s", "VM initialization failed\n"); 960 fprintf(stderr, "%s", "VM initialization failed\n");
992 fflush(stderr); 961 fflush(stderr);
993 exit(kErrorExitCode); 962 exit(kErrorExitCode);
994 } 963 }
995 964
996 // Start event handler. 965
997 EventHandler::Start();
998 966
999 // Start the debugger wire protocol handler if necessary. 967 // Start the debugger wire protocol handler if necessary.
1000 if (start_debugger) { 968 if (start_debugger) {
1001 ASSERT(debug_port >= 0); 969 ASSERT(debug_port >= 0);
1002 bool print_msg = verbose_debug_seen || (debug_port == 0); 970 bool print_msg = verbose_debug_seen || (debug_port == 0);
1003 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port); 971 debug_port = DebuggerConnectionHandler::StartHandler(debug_ip, debug_port);
1004 if (print_msg) { 972 if (print_msg) {
1005 Log::Print("Debugger listening on port %d\n", debug_port); 973 Log::Print("Debugger listening on port %d\n", debug_port);
1006 } 974 }
975 } else {
976 DebuggerConnectionHandler::InitForVmService();
1007 } 977 }
1008 978
1009 ASSERT(Dart_CurrentIsolate() == NULL); 979 Dart_RegisterIsolateServiceRequestCallback(
1010 // Start the VM service isolate, if necessary.
1011 if (start_vm_service) {
1012 if (!start_debugger) {
1013 DebuggerConnectionHandler::InitForVmService();
1014 }
1015 bool r = VmService::Start(vm_service_server_ip, vm_service_server_port);
1016 if (!r) {
1017 Log::PrintErr("Could not start VM Service isolate %s\n",
1018 VmService::GetErrorMessage());
1019 }
1020 Dart_RegisterIsolateServiceRequestCallback(
1021 "io", &ServiceRequestHandler, NULL); 980 "io", &ServiceRequestHandler, NULL);
1022 }
1023 ASSERT(Dart_CurrentIsolate() == NULL);
1024 981
1025 // Call CreateIsolateAndSetup which creates an isolate and loads up 982 // Call CreateIsolateAndSetup which creates an isolate and loads up
1026 // the specified application script. 983 // the specified application script.
1027 char* error = NULL; 984 char* error = NULL;
1028 bool is_compile_error = false; 985 bool is_compile_error = false;
1029 char* isolate_name = BuildIsolateName(script_name, "main"); 986 char* isolate_name = BuildIsolateName(script_name, "main");
1030 Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name, 987 Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name,
1031 "main", 988 "main",
1032 commandline_package_root, 989 commandline_package_root,
1033 &error, 990 &error,
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1160 exit(Process::GlobalExitCode()); 1117 exit(Process::GlobalExitCode());
1161 } 1118 }
1162 1119
1163 } // namespace bin 1120 } // namespace bin
1164 } // namespace dart 1121 } // namespace dart
1165 1122
1166 int main(int argc, char** argv) { 1123 int main(int argc, char** argv) {
1167 dart::bin::main(argc, argv); 1124 dart::bin::main(argc, argv);
1168 UNREACHABLE(); 1125 UNREACHABLE();
1169 } 1126 }
OLDNEW
« no previous file with comments | « runtime/bin/io_impl_sources.gypi ('k') | runtime/bin/platform.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698