| // 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 |