| Index: runtime/bin/main.cc
|
| diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
|
| index ee7b80d8efaee4622b4aa7b54bc4f5d73f5c93b6..16b5d3358e9a6d906dd2f3d458fb3266699f44df 100644
|
| --- a/runtime/bin/main.cc
|
| +++ b/runtime/bin/main.cc
|
| @@ -110,6 +110,7 @@ static const int kCompilationErrorExitCode = 254;
|
| // Exit code indicating an unhandled error that is not a compilation error.
|
| static const int kErrorExitCode = 255;
|
|
|
| +extern bool do_vm_shutdown; // Defined in bin/process.cc
|
| static void ErrorExit(int exit_code, const char* format, ...) {
|
| va_list arguments;
|
| va_start(arguments, format);
|
| @@ -120,11 +121,19 @@ static void ErrorExit(int exit_code, const char* format, ...) {
|
| Dart_ExitScope();
|
| Dart_ShutdownIsolate();
|
|
|
| - Dart_Cleanup();
|
| + // Terminate process exit-code handler.
|
| + Process::TerminateExitCodeHandler();
|
|
|
| - DebuggerConnectionHandler::StopHandler();
|
| - // TODO(zra): Stop the EventHandler once thread shutdown is enabled.
|
| - // EventHandler::Stop();
|
| + char* error = Dart_Cleanup();
|
| + if (error != NULL) {
|
| + Log::PrintErr("VM cleanup failed: %s\n", error);
|
| + free(error);
|
| + }
|
| +
|
| + if (do_vm_shutdown) {
|
| + DebuggerConnectionHandler::StopHandler();
|
| + EventHandler::Stop();
|
| + }
|
| exit(exit_code);
|
| }
|
|
|
| @@ -430,30 +439,60 @@ static bool ProcessTraceLoadingOption(const char* arg,
|
| }
|
|
|
|
|
| +
|
| +static bool ProcessShutdownOption(const char* arg,
|
| + CommandLineOptions* vm_options) {
|
| + ASSERT(arg != NULL);
|
| + if (*arg == '\0') {
|
| + do_vm_shutdown = true;
|
| + vm_options->AddArgument("--shutdown");
|
| + return true;
|
| + }
|
| +
|
| + if ((*arg != '=') && (*arg != ':')) {
|
| + return false;
|
| + }
|
| +
|
| + if (strcmp(arg + 1, "true") == 0) {
|
| + do_vm_shutdown = true;
|
| + vm_options->AddArgument("--shutdown");
|
| + return true;
|
| + } else if (strcmp(arg + 1, "false") == 0) {
|
| + do_vm_shutdown = false;
|
| + vm_options->AddArgument("--no-shutdown");
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| +}
|
| +
|
| +
|
| static struct {
|
| const char* option_name;
|
| bool (*process)(const char* option, CommandLineOptions* vm_options);
|
| } main_options[] = {
|
| // Standard options shared with dart2js.
|
| - { "--version", ProcessVersionOption },
|
| - { "--help", ProcessHelpOption },
|
| + { "-D", ProcessEnvironmentOption },
|
| { "-h", ProcessHelpOption },
|
| - { "--verbose", ProcessVerboseOption },
|
| - { "-v", ProcessVerboseOption },
|
| - { "--package-root=", ProcessPackageRootOption },
|
| + { "--help", ProcessHelpOption },
|
| { "--packages=", ProcessPackagesOption },
|
| - { "-D", ProcessEnvironmentOption },
|
| + { "--package-root=", ProcessPackageRootOption },
|
| + { "-v", ProcessVerboseOption },
|
| + { "--verbose", ProcessVerboseOption },
|
| + { "--version", ProcessVersionOption },
|
| +
|
| // VM specific options to the standalone dart program.
|
| { "--break-at=", ProcessBreakpointOption },
|
| { "--compile_all", ProcessCompileAllOption },
|
| - { "--gen-precompiled-snapshot", ProcessGenPrecompiledSnapshotOption },
|
| - { "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption },
|
| { "--debug", ProcessDebugOption },
|
| - { "--snapshot=", ProcessGenScriptSnapshotOption },
|
| { "--enable-vm-service", ProcessEnableVmServiceOption },
|
| + { "--gen-precompiled-snapshot", ProcessGenPrecompiledSnapshotOption },
|
| { "--observe", ProcessObserveOption },
|
| + { "--run-precompiled-snapshot", ProcessRunPrecompiledSnapshotOption },
|
| + { "--shutdown", ProcessShutdownOption },
|
| + { "--snapshot=", ProcessGenScriptSnapshotOption },
|
| { "--trace-debug-protocol", ProcessTraceDebugProtocolOption },
|
| - { "--trace-loading", ProcessTraceLoadingOption},
|
| + { "--trace-loading", ProcessTraceLoadingOption },
|
| { NULL, NULL }
|
| };
|
|
|
| @@ -660,6 +699,7 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
| error);
|
|
|
| if (isolate == NULL) {
|
| + delete isolate_data;
|
| return NULL;
|
| }
|
|
|
| @@ -728,7 +768,8 @@ static Dart_Isolate CreateIsolateAndSetupHelper(const char* script_uri,
|
|
|
| Platform::SetPackageRoot(package_root);
|
|
|
| - DartUtils::SetupIOLibrary(script_uri);
|
| + result = DartUtils::SetupIOLibrary(script_uri);
|
| + CHECK_RESULT(result);
|
|
|
| // Make the isolate runnable so that it is ready to handle messages.
|
| Dart_ExitScope();
|
| @@ -1121,18 +1162,22 @@ void main(int argc, char** argv) {
|
| }
|
|
|
| // Initialize the Dart VM.
|
| - if (!Dart_Initialize(vm_isolate_snapshot_buffer, instructions_snapshot,
|
| - CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate,
|
| - DartUtils::OpenFile,
|
| - DartUtils::ReadFile,
|
| - DartUtils::WriteFile,
|
| - DartUtils::CloseFile,
|
| - DartUtils::EntropySource)) {
|
| - fprintf(stderr, "%s", "VM initialization failed\n");
|
| + char* error = Dart_Initialize(
|
| + vm_isolate_snapshot_buffer, instructions_snapshot,
|
| + CreateIsolateAndSetup, NULL, NULL, ShutdownIsolate,
|
| + DartUtils::OpenFile,
|
| + DartUtils::ReadFile,
|
| + DartUtils::WriteFile,
|
| + DartUtils::CloseFile,
|
| + DartUtils::EntropySource);
|
| + if (error != NULL) {
|
| + if (do_vm_shutdown) {
|
| + DebuggerConnectionHandler::StopHandler();
|
| + EventHandler::Stop();
|
| + }
|
| + fprintf(stderr, "VM initialization failed: %s\n", error);
|
| fflush(stderr);
|
| - DebuggerConnectionHandler::StopHandler();
|
| - // TODO(zra): Stop the EventHandler once thread shutdown is enabled.
|
| - // EventHandler::Stop();
|
| + free(error);
|
| exit(kErrorExitCode);
|
| }
|
|
|
| @@ -1143,7 +1188,6 @@ void main(int argc, char** argv) {
|
|
|
| // Call CreateIsolateAndSetup which creates an isolate and loads up
|
| // the specified application script.
|
| - char* error = NULL;
|
| int exit_code = 0;
|
| char* isolate_name = BuildIsolateName(script_name, "main");
|
| Dart_Isolate isolate = CreateIsolateAndSetupHelper(script_name,
|
| @@ -1156,10 +1200,18 @@ void main(int argc, char** argv) {
|
| if (isolate == NULL) {
|
| Log::PrintErr("%s\n", error);
|
| free(error);
|
| + error = NULL;
|
| delete [] isolate_name;
|
| - DebuggerConnectionHandler::StopHandler();
|
| - // TODO(zra): Stop the EventHandler once thread shutdown is enabled.
|
| - // EventHandler::Stop();
|
| + Process::TerminateExitCodeHandler();
|
| + error = Dart_Cleanup();
|
| + if (error != NULL) {
|
| + Log::PrintErr("VM cleanup failed: %s\n", error);
|
| + free(error);
|
| + }
|
| + if (do_vm_shutdown) {
|
| + DebuggerConnectionHandler::StopHandler();
|
| + EventHandler::Stop();
|
| + }
|
| exit((exit_code != 0) ? exit_code : kErrorExitCode);
|
| }
|
| delete [] isolate_name;
|
| @@ -1286,11 +1338,15 @@ void main(int argc, char** argv) {
|
| // Terminate process exit-code handler.
|
| Process::TerminateExitCodeHandler();
|
|
|
| - Dart_Cleanup();
|
| -
|
| - DebuggerConnectionHandler::StopHandler();
|
| - // TODO(zra): Stop the EventHandler once thread shutdown is enabled.
|
| - // EventHandler::Stop();
|
| + error = Dart_Cleanup();
|
| + if (error != NULL) {
|
| + Log::PrintErr("VM cleanup failed: %s\n", error);
|
| + free(error);
|
| + }
|
| + if (do_vm_shutdown) {
|
| + DebuggerConnectionHandler::StopHandler();
|
| + EventHandler::Stop();
|
| + }
|
|
|
| // Free copied argument strings if converted.
|
| if (argv_converted) {
|
|
|