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) { |