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 Devlieghere SystemLifetimeManager::SystemLifetimeManager() : m_mutex() {}
19b9c1b51eSKate Stone 
~SystemLifetimeManager()20b9c1b51eSKate Stone SystemLifetimeManager::~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 Devlieghere llvm::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 Stone void 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