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