| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "bin/error_exit.h" |
| |
| #include "bin/eventhandler.h" |
| #include "bin/platform.h" |
| #include "bin/process.h" |
| #include "include/dart_api.h" |
| #include "platform/assert.h" |
| #include "platform/globals.h" |
| #include "platform/syslog.h" |
| |
| namespace dart { |
| namespace bin { |
| |
| void ErrorExit(int exit_code, const char* format, ...) { |
| va_list arguments; |
| va_start(arguments, format); |
| Syslog::VPrintErr(format, arguments); |
| va_end(arguments); |
| |
| // Sometimes ErrorExit is called even before we have entered an isolate. |
| // We need to shutdown the isolate only if one exists. |
| if (Dart_CurrentIsolate() != nullptr) { |
| Dart_ShutdownIsolate(); |
| } |
| |
| // Terminate process exit-code handler. |
| Process::TerminateExitCodeHandler(); |
| |
| char* error = Dart_Cleanup(); |
| if (error != nullptr) { |
| Syslog::PrintErr("VM cleanup failed: %s\n", error); |
| free(error); |
| } |
| |
| Process::ClearAllSignalHandlers(); |
| EventHandler::Stop(); |
| Platform::Exit(exit_code); |
| } |
| |
| } // namespace bin |
| } // namespace dart |