Chromium Code Reviews| 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(); |
|
Ivan Posva
2015/09/14 21:52:13
Why is this done unconditionally, while the EventH
zra
2015/09/14 22:59:00
Process::TerminateExitCodeHandler() was already be
|
| + 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) { |