1dda28197Spatrick //===-- SystemLifetimeManager.cpp -----------------------------------------===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9061da546Spatrick #include "lldb/Initialization/SystemLifetimeManager.h" 10061da546Spatrick 11061da546Spatrick #include "lldb/Core/Debugger.h" 12061da546Spatrick #include "lldb/Initialization/SystemInitializer.h" 13061da546Spatrick 14061da546Spatrick #include <utility> 15061da546Spatrick 16061da546Spatrick using namespace lldb_private; 17061da546Spatrick SystemLifetimeManager()18*be691f3bSpatrickSystemLifetimeManager::SystemLifetimeManager() : m_mutex() {} 19061da546Spatrick ~SystemLifetimeManager()20061da546SpatrickSystemLifetimeManager::~SystemLifetimeManager() { 21061da546Spatrick assert(!m_initialized && 22061da546Spatrick "SystemLifetimeManager destroyed without calling Terminate!"); 23061da546Spatrick } 24061da546Spatrick Initialize(std::unique_ptr<SystemInitializer> initializer,LoadPluginCallbackType plugin_callback)25061da546Spatrickllvm::Error SystemLifetimeManager::Initialize( 26061da546Spatrick std::unique_ptr<SystemInitializer> initializer, 27061da546Spatrick LoadPluginCallbackType plugin_callback) { 28061da546Spatrick std::lock_guard<std::recursive_mutex> guard(m_mutex); 29061da546Spatrick if (!m_initialized) { 30061da546Spatrick assert(!m_initializer && "Attempting to call " 31061da546Spatrick "SystemLifetimeManager::Initialize() when it is " 32061da546Spatrick "already initialized"); 33061da546Spatrick m_initialized = true; 34061da546Spatrick m_initializer = std::move(initializer); 35061da546Spatrick 36061da546Spatrick if (auto e = m_initializer->Initialize()) 37061da546Spatrick return e; 38061da546Spatrick 39061da546Spatrick Debugger::Initialize(plugin_callback); 40061da546Spatrick } 41061da546Spatrick 42061da546Spatrick return llvm::Error::success(); 43061da546Spatrick } 44061da546Spatrick Terminate()45061da546Spatrickvoid SystemLifetimeManager::Terminate() { 46061da546Spatrick std::lock_guard<std::recursive_mutex> guard(m_mutex); 47061da546Spatrick 48061da546Spatrick if (m_initialized) { 49061da546Spatrick Debugger::Terminate(); 50061da546Spatrick m_initializer->Terminate(); 51061da546Spatrick 52061da546Spatrick m_initializer.reset(); 53061da546Spatrick m_initialized = false; 54061da546Spatrick } 55061da546Spatrick } 56