diff --git a/runtime/bin/dart_embedder_api_impl.cc b/runtime/bin/dart_embedder_api_impl.cc index 73974eae7bc..fd2c0e68752 100644 --- a/runtime/bin/dart_embedder_api_impl.cc +++ b/runtime/bin/dart_embedder_api_impl.cc @@ -7,6 +7,8 @@ #include "bin/dartutils.h" #include "bin/eventhandler.h" #include "bin/isolate_data.h" +#include "bin/process.h" +#include "bin/secure_socket_filter.h" #include "bin/thread.h" #include "bin/utils.h" #include "bin/vmservice_impl.h" @@ -37,10 +39,24 @@ bool InitOnce(char** error) { return false; } bin::TimerUtils::InitOnce(); + bin::Process::Init(); +#if !defined(DART_IO_SECURE_SOCKET_DISABLED) + bin::SSLFilter::Init(); +#endif bin::EventHandler::Start(); return true; } +void Cleanup() { + bin::Process::ClearAllSignalHandlers(); + + bin::EventHandler::Stop(); +#if !defined(DART_IO_SECURE_SOCKET_DISABLED) + bin::SSLFilter::Cleanup(); +#endif + bin::Process::Cleanup(); +} + Dart_Isolate CreateKernelServiceIsolate(const IsolateCreationData& data, const uint8_t* buffer, intptr_t buffer_size, diff --git a/runtime/bin/dart_io_api_impl.cc b/runtime/bin/dart_io_api_impl.cc index e8ab2adc936..18be4c8e14e 100644 --- a/runtime/bin/dart_io_api_impl.cc +++ b/runtime/bin/dart_io_api_impl.cc @@ -10,6 +10,7 @@ #include "bin/io_natives.h" #include "bin/platform.h" #include "bin/process.h" +#include "bin/secure_socket_filter.h" #include "bin/thread.h" #include "bin/utils.h" @@ -19,11 +20,19 @@ namespace bin { void BootstrapDartIo() { // Bootstrap 'dart:io' event handler. TimerUtils::InitOnce(); + Process::Init(); +#if !defined(DART_IO_SECURE_SOCKET_DISABLED) + SSLFilter::Init(); +#endif EventHandler::Start(); } void CleanupDartIo() { EventHandler::Stop(); +#if !defined(DART_IO_SECURE_SOCKET_DISABLED) + SSLFilter::Cleanup(); +#endif + Process::Cleanup(); } void SetSystemTempDirectory(const char* system_temp) { diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc index e1a5afe2a2e..ac3baa542ae 100644 --- a/runtime/bin/main.cc +++ b/runtime/bin/main.cc @@ -860,8 +860,7 @@ bool RunMainIsolate(const char* script_name, CommandLineOptions* dart_options) { Syslog::PrintErr("VM cleanup failed: %s\n", error); free(error); } - Process::ClearAllSignalHandlers(); - EventHandler::Stop(); + dart::embedder::Cleanup(); Platform::Exit((exit_code != 0) ? exit_code : kErrorExitCode); } main_isolate = isolate; @@ -1190,7 +1189,7 @@ void main(int argc, char** argv) { error = Dart_Initialize(&init_params); if (error != NULL) { - EventHandler::Stop(); + dart::embedder::Cleanup(); Syslog::PrintErr("VM initialization failed: %s\n", error); free(error); Platform::Exit(kErrorExitCode); @@ -1214,8 +1213,8 @@ void main(int argc, char** argv) { Syslog::PrintErr("VM cleanup failed: %s\n", error); free(error); } - Process::ClearAllSignalHandlers(); - EventHandler::Stop(); + const intptr_t global_exit_code = Process::GlobalExitCode(); + dart::embedder::Cleanup(); delete app_snapshot; free(app_script_uri); @@ -1230,7 +1229,7 @@ void main(int argc, char** argv) { // Free environment if any. Options::DestroyEnvironment(); - Platform::Exit(Process::GlobalExitCode()); + Platform::Exit(global_exit_code); } } // namespace bin diff --git a/runtime/bin/process.h b/runtime/bin/process.h index 4f34a36c311..a1aa3b9d72f 100644 --- a/runtime/bin/process.h +++ b/runtime/bin/process.h @@ -87,6 +87,9 @@ enum ProcessStartMode { class Process { public: + static void Init(); + static void Cleanup(); + // Start a new process providing access to stdin, stdout, stderr and // process exit streams. static int Start(Namespace* namespc, diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc index 44df4d692d2..2a01538f121 100644 --- a/runtime/bin/process_android.cc +++ b/runtime/bin/process_android.cc @@ -35,7 +35,7 @@ namespace dart { namespace bin { int Process::global_exit_code_ = 0; -Mutex* Process::global_exit_code_mutex_ = new Mutex(); +Mutex* Process::global_exit_code_mutex_ = nullptr; Process::ExitHook Process::exit_hook_ = NULL; // ProcessInfo is used to map a process id to the file descriptor for @@ -68,6 +68,9 @@ class ProcessInfo { // started from Dart. class ProcessInfoList { public: + static void Init(); + static void Cleanup(); + static void AddProcess(pid_t pid, intptr_t fd) { MutexLocker locker(mutex_); ProcessInfo* info = new ProcessInfo(pid, fd); @@ -119,7 +122,7 @@ class ProcessInfoList { }; ProcessInfo* ProcessInfoList::active_processes_ = NULL; -Mutex* ProcessInfoList::mutex_ = new Mutex(); +Mutex* ProcessInfoList::mutex_ = nullptr; // The exit code handler sets up a separate thread which waits for child // processes to terminate. That separate thread can then get the exit code from @@ -127,6 +130,9 @@ Mutex* ProcessInfoList::mutex_ = new Mutex(); // event loop. class ExitCodeHandler { public: + static void Init(); + static void Cleanup(); + // Notify the ExitCodeHandler that another process exists. static void ProcessStarted() { // Multiple isolates could be starting processes at the same @@ -241,7 +247,7 @@ class ExitCodeHandler { bool ExitCodeHandler::running_ = false; int ExitCodeHandler::process_count_ = 0; bool ExitCodeHandler::terminate_done_ = false; -Monitor* ExitCodeHandler::monitor_ = new Monitor(); +Monitor* ExitCodeHandler::monitor_ = nullptr; class ProcessStarter { public: @@ -953,7 +959,7 @@ int64_t Process::MaxRSS() { return usage.ru_maxrss * KB; } -static Mutex* signal_mutex = new Mutex(); +static Mutex* signal_mutex = nullptr; static SignalInfo* signal_handlers = NULL; static const int kSignalsCount = 7; static const int kSignals[kSignalsCount] = { @@ -1057,6 +1063,54 @@ void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) { } } +void ProcessInfoList::Init() { + ASSERT(ProcessInfoList::mutex_ == nullptr); + ProcessInfoList::mutex_ = new Mutex(); +} + +void ProcessInfoList::Cleanup() { + ASSERT(ProcessInfoList::mutex_ != nullptr); + delete ProcessInfoList::mutex_; + ProcessInfoList::mutex_ = nullptr; +} + +void ExitCodeHandler::Init() { + ASSERT(ExitCodeHandler::monitor_ == nullptr); + ExitCodeHandler::monitor_ = new Monitor(); +} + +void ExitCodeHandler::Cleanup() { + ASSERT(ExitCodeHandler::monitor_ != nullptr); + delete ExitCodeHandler::monitor_; + ExitCodeHandler::monitor_ = nullptr; +} + +void Process::Init() { + ExitCodeHandler::Init(); + ProcessInfoList::Init(); + + ASSERT(signal_mutex == nullptr); + signal_mutex = new Mutex(); + + ASSERT(Process::global_exit_code_mutex_ == nullptr); + Process::global_exit_code_mutex_ = new Mutex(); +} + +void Process::Cleanup() { + ClearAllSignalHandlers(); + + ASSERT(signal_mutex != nullptr); + delete signal_mutex; + signal_mutex = nullptr; + + ASSERT(Process::global_exit_code_mutex_ != nullptr); + delete Process::global_exit_code_mutex_; + Process::global_exit_code_mutex_ = nullptr; + + ProcessInfoList::Cleanup(); + ExitCodeHandler::Cleanup(); +} + } // namespace bin } // namespace dart diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc index 087d875d5a1..bbf938755b3 100644 --- a/runtime/bin/process_fuchsia.cc +++ b/runtime/bin/process_fuchsia.cc @@ -50,7 +50,7 @@ namespace dart { namespace bin { int Process::global_exit_code_ = 0; -Mutex* Process::global_exit_code_mutex_ = new Mutex(); +Mutex* Process::global_exit_code_mutex_ = nullptr; Process::ExitHook Process::exit_hook_ = NULL; // ProcessInfo is used to map a process id to the file descriptor for @@ -140,7 +140,7 @@ class ProcessInfoList { }; ProcessInfo* ProcessInfoList::active_processes_ = NULL; -Mutex* ProcessInfoList::mutex_ = new Mutex(); +Mutex* ProcessInfoList::mutex_ = nullptr; // The exit code handler sets up a separate thread which waits for child // processes to terminate. That separate thread can then get the exit code from @@ -297,7 +297,7 @@ class ExitCodeHandler { zx_handle_t ExitCodeHandler::port_ = ZX_HANDLE_INVALID; bool ExitCodeHandler::running_ = false; bool ExitCodeHandler::terminate_done_ = false; -Monitor* ExitCodeHandler::monitor_ = new Monitor(); +Monitor* ExitCodeHandler::monitor_ = nullptr; void Process::TerminateExitCodeHandler() { ExitCodeHandler::Terminate(); @@ -812,6 +812,54 @@ intptr_t Process::SetSignalHandler(intptr_t signal) { void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) {} +void ProcessInfoList::Init() { + ASSERT(ProcessInfoList::mutex_ == nullptr); + ProcessInfoList::mutex_ = new Mutex(); +} + +void ProcessInfoList::Cleanup() { + ASSERT(ProcessInfoList::mutex_ != nullptr); + delete ProcessInfoList::mutex_; + ProcessInfoList::mutex_ = nullptr; +} + +void ExitCodeHandler::Init() { + ASSERT(ExitCodeHandler::monitor_ == nullptr); + ExitCodeHandler::monitor_ = new Monitor(); +} + +void ExitCodeHandler::Cleanup() { + ASSERT(ExitCodeHandler::monitor_ != nullptr); + delete ExitCodeHandler::monitor_; + ExitCodeHandler::monitor_ = nullptr; +} + +void Process::Init() { + ExitCodeHandler::Init(); + ProcessInfoList::Init(); + + ASSERT(signal_mutex == nullptr); + signal_mutex = new Mutex(); + + ASSERT(Process::global_exit_code_mutex_ == nullptr); + Process::global_exit_code_mutex_ = new Mutex(); +} + +void Process::Cleanup() { + ClearAllSignalHandlers(); + + ASSERT(signal_mutex != nullptr); + delete signal_mutex; + signal_mutex = nullptr; + + ASSERT(Process::global_exit_code_mutex_ != nullptr); + delete Process::global_exit_code_mutex_; + Process::global_exit_code_mutex_ = nullptr; + + ProcessInfoList::Cleanup(); + ExitCodeHandler::Cleanup(); +} + } // namespace bin } // namespace dart diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc index 5d82e1b8f8d..0f4106e5e8c 100644 --- a/runtime/bin/process_linux.cc +++ b/runtime/bin/process_linux.cc @@ -35,7 +35,7 @@ namespace dart { namespace bin { int Process::global_exit_code_ = 0; -Mutex* Process::global_exit_code_mutex_ = new Mutex(); +Mutex* Process::global_exit_code_mutex_ = nullptr; Process::ExitHook Process::exit_hook_ = NULL; // ProcessInfo is used to map a process id to the file descriptor for @@ -68,6 +68,9 @@ class ProcessInfo { // started from Dart. class ProcessInfoList { public: + static void Init(); + static void Cleanup(); + static void AddProcess(pid_t pid, intptr_t fd) { MutexLocker locker(mutex_); ProcessInfo* info = new ProcessInfo(pid, fd); @@ -119,7 +122,7 @@ class ProcessInfoList { }; ProcessInfo* ProcessInfoList::active_processes_ = NULL; -Mutex* ProcessInfoList::mutex_ = new Mutex(); +Mutex* ProcessInfoList::mutex_ = nullptr; // The exit code handler sets up a separate thread which waits for child // processes to terminate. That separate thread can then get the exit code from @@ -127,6 +130,9 @@ Mutex* ProcessInfoList::mutex_ = new Mutex(); // event loop. class ExitCodeHandler { public: + static void Init(); + static void Cleanup(); + // Notify the ExitCodeHandler that another process exists. static void ProcessStarted() { // Multiple isolates could be starting processes at the same @@ -241,7 +247,7 @@ class ExitCodeHandler { bool ExitCodeHandler::running_ = false; int ExitCodeHandler::process_count_ = 0; bool ExitCodeHandler::terminate_done_ = false; -Monitor* ExitCodeHandler::monitor_ = new Monitor(); +Monitor* ExitCodeHandler::monitor_ = nullptr; class ProcessStarter { public: @@ -952,7 +958,7 @@ int64_t Process::MaxRSS() { return usage.ru_maxrss * KB; } -static Mutex* signal_mutex = new Mutex(); +static Mutex* signal_mutex = nullptr; static SignalInfo* signal_handlers = NULL; static const int kSignalsCount = 7; static const int kSignals[kSignalsCount] = { @@ -1053,6 +1059,54 @@ void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) { } } +void ProcessInfoList::Init() { + ASSERT(ProcessInfoList::mutex_ == nullptr); + ProcessInfoList::mutex_ = new Mutex(); +} + +void ProcessInfoList::Cleanup() { + ASSERT(ProcessInfoList::mutex_ != nullptr); + delete ProcessInfoList::mutex_; + ProcessInfoList::mutex_ = nullptr; +} + +void ExitCodeHandler::Init() { + ASSERT(ExitCodeHandler::monitor_ == nullptr); + ExitCodeHandler::monitor_ = new Monitor(); +} + +void ExitCodeHandler::Cleanup() { + ASSERT(ExitCodeHandler::monitor_ != nullptr); + delete ExitCodeHandler::monitor_; + ExitCodeHandler::monitor_ = nullptr; +} + +void Process::Init() { + ExitCodeHandler::Init(); + ProcessInfoList::Init(); + + ASSERT(signal_mutex == nullptr); + signal_mutex = new Mutex(); + + ASSERT(Process::global_exit_code_mutex_ == nullptr); + Process::global_exit_code_mutex_ = new Mutex(); +} + +void Process::Cleanup() { + ClearAllSignalHandlers(); + + ASSERT(signal_mutex != nullptr); + delete signal_mutex; + signal_mutex = nullptr; + + ASSERT(Process::global_exit_code_mutex_ != nullptr); + delete Process::global_exit_code_mutex_; + Process::global_exit_code_mutex_ = nullptr; + + ProcessInfoList::Cleanup(); + ExitCodeHandler::Cleanup(); +} + } // namespace bin } // namespace dart diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc index 536b1b33c01..df673481758 100644 --- a/runtime/bin/process_macos.cc +++ b/runtime/bin/process_macos.cc @@ -34,7 +34,7 @@ namespace dart { namespace bin { int Process::global_exit_code_ = 0; -Mutex* Process::global_exit_code_mutex_ = new Mutex(); +Mutex* Process::global_exit_code_mutex_ = nullptr; Process::ExitHook Process::exit_hook_ = NULL; // ProcessInfo is used to map a process id to the file descriptor for @@ -67,6 +67,9 @@ class ProcessInfo { // started from Dart. class ProcessInfoList { public: + static void Init(); + static void Cleanup(); + static void AddProcess(pid_t pid, intptr_t fd) { MutexLocker locker(mutex_); ProcessInfo* info = new ProcessInfo(pid, fd); @@ -118,7 +121,7 @@ class ProcessInfoList { }; ProcessInfo* ProcessInfoList::active_processes_ = NULL; -Mutex* ProcessInfoList::mutex_ = new Mutex(); +Mutex* ProcessInfoList::mutex_ = nullptr; // The exit code handler sets up a separate thread which waits for child // processes to terminate. That separate thread can then get the exit code from @@ -126,6 +129,9 @@ Mutex* ProcessInfoList::mutex_ = new Mutex(); // event loop. class ExitCodeHandler { public: + static void Init(); + static void Cleanup(); + // Notify the ExitCodeHandler that another process exists. static void ProcessStarted() { // Multiple isolates could be starting processes at the same @@ -237,7 +243,7 @@ class ExitCodeHandler { bool ExitCodeHandler::running_ = false; int ExitCodeHandler::process_count_ = 0; bool ExitCodeHandler::terminate_done_ = false; -Monitor* ExitCodeHandler::monitor_ = new Monitor(); +Monitor* ExitCodeHandler::monitor_ = nullptr; class ProcessStarter { public: @@ -976,7 +982,7 @@ int64_t Process::MaxRSS() { return usage.ru_maxrss; } -static Mutex* signal_mutex = new Mutex(); +static Mutex* signal_mutex = nullptr; static SignalInfo* signal_handlers = NULL; static const int kSignalsCount = 7; static const int kSignals[kSignalsCount] = { @@ -1089,6 +1095,54 @@ void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) { } } +void ProcessInfoList::Init() { + ASSERT(ProcessInfoList::mutex_ == nullptr); + ProcessInfoList::mutex_ = new Mutex(); +} + +void ProcessInfoList::Cleanup() { + ASSERT(ProcessInfoList::mutex_ != nullptr); + delete ProcessInfoList::mutex_; + ProcessInfoList::mutex_ = nullptr; +} + +void ExitCodeHandler::Init() { + ASSERT(ExitCodeHandler::monitor_ == nullptr); + ExitCodeHandler::monitor_ = new Monitor(); +} + +void ExitCodeHandler::Cleanup() { + ASSERT(ExitCodeHandler::monitor_ != nullptr); + delete ExitCodeHandler::monitor_; + ExitCodeHandler::monitor_ = nullptr; +} + +void Process::Init() { + ExitCodeHandler::Init(); + ProcessInfoList::Init(); + + ASSERT(signal_mutex == nullptr); + signal_mutex = new Mutex(); + + ASSERT(Process::global_exit_code_mutex_ == nullptr); + Process::global_exit_code_mutex_ = new Mutex(); +} + +void Process::Cleanup() { + ClearAllSignalHandlers(); + + ASSERT(signal_mutex != nullptr); + delete signal_mutex; + signal_mutex = nullptr; + + ASSERT(Process::global_exit_code_mutex_ != nullptr); + delete Process::global_exit_code_mutex_; + Process::global_exit_code_mutex_ = nullptr; + + ProcessInfoList::Cleanup(); + ExitCodeHandler::Cleanup(); +} + } // namespace bin } // namespace dart diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc index 4c3c1de140d..564886729c8 100644 --- a/runtime/bin/process_win.cc +++ b/runtime/bin/process_win.cc @@ -27,7 +27,7 @@ static const int kReadHandle = 0; static const int kWriteHandle = 1; int Process::global_exit_code_ = 0; -Mutex* Process::global_exit_code_mutex_ = new Mutex(); +Mutex* Process::global_exit_code_mutex_ = nullptr; Process::ExitHook Process::exit_hook_ = NULL; // ProcessInfo is used to map a process id to the process handle, @@ -84,6 +84,9 @@ class ProcessInfo { // started from Dart. class ProcessInfoList { public: + static void Init(); + static void Cleanup(); + static void AddProcess(DWORD pid, HANDLE handle, HANDLE pipe) { // Register a callback to extract the exit code, when the process // is signaled. The callback runs in a independent thread from the OS pool. @@ -199,7 +202,7 @@ class ProcessInfoList { }; ProcessInfo* ProcessInfoList::active_processes_ = NULL; -Mutex* ProcessInfoList::mutex_ = new Mutex(); +Mutex* ProcessInfoList::mutex_ = nullptr; // Types of pipes to create. enum NamedPipeType { kInheritRead, kInheritWrite, kInheritNone }; @@ -331,12 +334,13 @@ static InitProcThreadAttrListFn init_proc_thread_attr_list = NULL; static UpdateProcThreadAttrFn update_proc_thread_attr = NULL; static DeleteProcThreadAttrListFn delete_proc_thread_attr_list = NULL; +static Mutex* initialized_mutex = nullptr; +static bool load_attempted = false; + static bool EnsureInitialized() { - static bool load_attempted = false; - static Mutex* mutex = new Mutex(); HMODULE kernel32_module = GetModuleHandleW(L"kernel32.dll"); if (!load_attempted) { - MutexLocker locker(mutex); + MutexLocker locker(initialized_mutex); if (load_attempted) { return (delete_proc_thread_attr_list != NULL); } @@ -943,7 +947,7 @@ int64_t Process::MaxRSS() { } static SignalInfo* signal_handlers = NULL; -static Mutex* signal_mutex = new Mutex(); +static Mutex* signal_mutex = nullptr; SignalInfo::~SignalInfo() { FileHandle* file_handle = reinterpret_cast(fd_); @@ -1051,6 +1055,48 @@ void Process::ClearSignalHandler(intptr_t signal, Dart_Port port) { } } +void ProcessInfoList::Init() { + ASSERT(ProcessInfoList::mutex_ == nullptr); + ProcessInfoList::mutex_ = new Mutex(); +} + +void ProcessInfoList::Cleanup() { + ASSERT(ProcessInfoList::mutex_ != nullptr); + delete ProcessInfoList::mutex_; + ProcessInfoList::mutex_ = nullptr; +} + +void Process::Init() { + ProcessInfoList::Init(); + + ASSERT(signal_mutex == nullptr); + signal_mutex = new Mutex(); + + ASSERT(initialized_mutex == nullptr); + initialized_mutex = new Mutex(); + + ASSERT(Process::global_exit_code_mutex_ == nullptr); + Process::global_exit_code_mutex_ = new Mutex(); +} + +void Process::Cleanup() { + ClearAllSignalHandlers(); + + ASSERT(signal_mutex != nullptr); + delete signal_mutex; + signal_mutex = nullptr; + + ASSERT(initialized_mutex != nullptr); + delete initialized_mutex; + initialized_mutex = nullptr; + + ASSERT(Process::global_exit_code_mutex_ != nullptr); + delete Process::global_exit_code_mutex_; + Process::global_exit_code_mutex_ = nullptr; + + ProcessInfoList::Cleanup(); +} + } // namespace bin } // namespace dart diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc index e99cd4e4dfb..5e44275b9d5 100644 --- a/runtime/bin/run_vm_tests.cc +++ b/runtime/bin/run_vm_tests.cc @@ -10,6 +10,7 @@ #include "bin/file.h" #include "bin/loader.h" #include "bin/platform.h" +#include "bin/process.h" #include "bin/snapshot_utils.h" #include "bin/thread.h" #include "bin/utils.h" @@ -355,6 +356,7 @@ static int Main(int argc, const char** argv) { } bin::TimerUtils::InitOnce(); + bin::Process::Init(); bin::EventHandler::Start(); char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv); @@ -393,6 +395,7 @@ static int Main(int argc, const char** argv) { // Apply the filter to all registered benchmarks. Benchmark::RunAll(argv[0]); + bin::Process::TerminateExitCodeHandler(); error = Dart::Cleanup(); if (error != nullptr) { Syslog::PrintErr("Failed shutdown VM: %s\n", error); @@ -403,6 +406,7 @@ static int Main(int argc, const char** argv) { TestCaseBase::RunAllRaw(); bin::EventHandler::Stop(); + bin::Process::Cleanup(); // Print a warning message if no tests or benchmarks were matched. if (run_matches == 0) { diff --git a/runtime/bin/secure_socket_filter.cc b/runtime/bin/secure_socket_filter.cc index d61c5cb4123..a713441fc55 100644 --- a/runtime/bin/secure_socket_filter.cc +++ b/runtime/bin/secure_socket_filter.cc @@ -30,9 +30,20 @@ namespace bin { bool SSLFilter::library_initialized_ = false; // To protect library initialization. -Mutex* SSLFilter::mutex_ = new Mutex(); +Mutex* SSLFilter::mutex_ = nullptr; int SSLFilter::filter_ssl_index; +void SSLFilter::Init() { + ASSERT(SSLFilter::mutex_ == nullptr); + SSLFilter::mutex_ = new Mutex(); +} + +void SSLFilter::Cleanup() { + ASSERT(SSLFilter::mutex_ != nullptr); + delete SSLFilter::mutex_; + SSLFilter::mutex_ = nullptr; +} + const intptr_t SSLFilter::kInternalBIOSize = 10 * KB; const intptr_t SSLFilter::kApproximateSize = sizeof(SSLFilter) + (2 * SSLFilter::kInternalBIOSize); diff --git a/runtime/bin/secure_socket_filter.h b/runtime/bin/secure_socket_filter.h index e09f0e6f8f5..70ad32e54ff 100644 --- a/runtime/bin/secure_socket_filter.h +++ b/runtime/bin/secure_socket_filter.h @@ -23,6 +23,9 @@ extern unsigned int root_certificates_pem_length; class SSLFilter : public ReferenceCounted { public: + static void Init(); + static void Cleanup(); + // These enums must agree with those in sdk/lib/io/secure_socket.dart. enum BufferIndex { kReadPlaintext, diff --git a/runtime/include/dart_embedder_api.h b/runtime/include/dart_embedder_api.h index c9860ddd5ec..e565ebf6ee9 100644 --- a/runtime/include/dart_embedder_api.h +++ b/runtime/include/dart_embedder_api.h @@ -12,10 +12,20 @@ namespace dart { namespace embedder { // Initialize all subsystems of the embedder. +// +// Must be called before the `Dart_Initialize()` call to initialize the +// Dart VM. +// // Returns true on success and false otherwise, in which case error would // contain error message. DART_WARN_UNUSED_RESULT bool InitOnce(char** error); +// Cleans up all subsystems of the embedder. +// +// Must be called after the `Dart_Cleanup()` call to initialize the +// Dart VM. +void Cleanup(); + // Common arguments that are passed to isolate creation callback and to // API methods that create isolates. struct IsolateCreationData {