180814287SRaphael Isemann //===-- SystemLifetimeManager.cpp -----------------------------------------===// 2e6e2bb38SZachary Turner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e6e2bb38SZachary Turner // 7e6e2bb38SZachary Turner //===----------------------------------------------------------------------===// 8e6e2bb38SZachary Turner 9e6e2bb38SZachary Turner #include "lldb/Initialization/SystemLifetimeManager.h" 10e6e2bb38SZachary Turner 11e6e2bb38SZachary Turner #include "lldb/Core/Debugger.h" 12e6e2bb38SZachary Turner #include "lldb/Initialization/SystemInitializer.h" 13e6e2bb38SZachary Turner 14e6e2bb38SZachary Turner #include <utility> 15e6e2bb38SZachary Turner 16e6e2bb38SZachary Turner using namespace lldb_private; 17e6e2bb38SZachary Turner SystemLifetimeManager()18*9494c510SJonas DevlieghereSystemLifetimeManager::SystemLifetimeManager() : m_mutex() {} 19b9c1b51eSKate Stone ~SystemLifetimeManager()20b9c1b51eSKate StoneSystemLifetimeManager::~SystemLifetimeManager() { 21b9c1b51eSKate Stone assert(!m_initialized && 22b9c1b51eSKate Stone "SystemLifetimeManager destroyed without calling Terminate!"); 23e6e2bb38SZachary Turner } 24e6e2bb38SZachary Turner Initialize(std::unique_ptr<SystemInitializer> initializer,LoadPluginCallbackType plugin_callback)2515eacd74SJonas Devliegherellvm::Error SystemLifetimeManager::Initialize( 26b9c1b51eSKate Stone std::unique_ptr<SystemInitializer> initializer, 27936c6242SJonas Devlieghere LoadPluginCallbackType plugin_callback) { 2816ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 29b9c1b51eSKate Stone if (!m_initialized) { 30b9c1b51eSKate Stone assert(!m_initializer && "Attempting to call " 31b9c1b51eSKate Stone "SystemLifetimeManager::Initialize() when it is " 32b9c1b51eSKate Stone "already initialized"); 33e6e2bb38SZachary Turner m_initialized = true; 34e6e2bb38SZachary Turner m_initializer = std::move(initializer); 35e6e2bb38SZachary Turner 36936c6242SJonas Devlieghere if (auto e = m_initializer->Initialize()) 3715eacd74SJonas Devlieghere return e; 3815eacd74SJonas Devlieghere 39e6e2bb38SZachary Turner Debugger::Initialize(plugin_callback); 40e6e2bb38SZachary Turner } 4115eacd74SJonas Devlieghere 4215eacd74SJonas Devlieghere return llvm::Error::success(); 43e6e2bb38SZachary Turner } 44e6e2bb38SZachary Turner Terminate()45b9c1b51eSKate Stonevoid SystemLifetimeManager::Terminate() { 4616ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 47e6e2bb38SZachary Turner 48b9c1b51eSKate Stone if (m_initialized) { 49e6e2bb38SZachary Turner Debugger::Terminate(); 50e6e2bb38SZachary Turner m_initializer->Terminate(); 51e6e2bb38SZachary Turner 52e6e2bb38SZachary Turner m_initializer.reset(); 53e6e2bb38SZachary Turner m_initialized = false; 54e6e2bb38SZachary Turner } 55e6e2bb38SZachary Turner } 56