1285101Semaste//===-- SystemLifetimeManager.cpp ------------------------------*- C++ -*-===// 2285101Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6285101Semaste// 7285101Semaste//===----------------------------------------------------------------------===// 8285101Semaste 9285101Semaste#include "lldb/Initialization/SystemLifetimeManager.h" 10285101Semaste 11285101Semaste#include "lldb/Core/Debugger.h" 12285101Semaste#include "lldb/Initialization/SystemInitializer.h" 13285101Semaste 14285101Semaste#include <utility> 15285101Semaste 16285101Semasteusing namespace lldb_private; 17285101Semaste 18314564SdimSystemLifetimeManager::SystemLifetimeManager() 19314564Sdim : m_mutex(), m_initialized(false) {} 20285101Semaste 21314564SdimSystemLifetimeManager::~SystemLifetimeManager() { 22314564Sdim assert(!m_initialized && 23314564Sdim "SystemLifetimeManager destroyed without calling Terminate!"); 24285101Semaste} 25285101Semaste 26344779Sdimllvm::Error SystemLifetimeManager::Initialize( 27314564Sdim std::unique_ptr<SystemInitializer> initializer, 28353358Sdim LoadPluginCallbackType plugin_callback) { 29314564Sdim std::lock_guard<std::recursive_mutex> guard(m_mutex); 30314564Sdim if (!m_initialized) { 31314564Sdim assert(!m_initializer && "Attempting to call " 32314564Sdim "SystemLifetimeManager::Initialize() when it is " 33314564Sdim "already initialized"); 34314564Sdim m_initialized = true; 35314564Sdim m_initializer = std::move(initializer); 36285101Semaste 37353358Sdim if (auto e = m_initializer->Initialize()) 38344779Sdim return e; 39344779Sdim 40314564Sdim Debugger::Initialize(plugin_callback); 41314564Sdim } 42344779Sdim 43344779Sdim return llvm::Error::success(); 44285101Semaste} 45285101Semaste 46314564Sdimvoid SystemLifetimeManager::Terminate() { 47314564Sdim std::lock_guard<std::recursive_mutex> guard(m_mutex); 48285101Semaste 49314564Sdim if (m_initialized) { 50314564Sdim Debugger::Terminate(); 51314564Sdim m_initializer->Terminate(); 52285101Semaste 53314564Sdim m_initializer.reset(); 54314564Sdim m_initialized = false; 55314564Sdim } 56285101Semaste} 57