We already catch missing calls to SystemLifetimeManager::Terminate, but not for Initialize. This adds the missing assert and also makes sure it behaves correctly when initializing and terminating more than once, which is now supported.
49 lines
1.4 KiB
C++
49 lines
1.4 KiB
C++
//===-- SystemLifetimeManager.cpp -----------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Initialization/SystemLifetimeManager.h"
|
|
|
|
#include "lldb/Initialization/SystemInitializer.h"
|
|
|
|
#include <utility>
|
|
|
|
using namespace lldb_private;
|
|
|
|
SystemLifetimeManager::SystemLifetimeManager() : m_mutex() {}
|
|
|
|
SystemLifetimeManager::~SystemLifetimeManager() {
|
|
assert(m_initialized != 0 &&
|
|
"SystemLifetimeManager destroyed without calling Initialize!");
|
|
assert(m_initialized == m_terminated &&
|
|
"SystemLifetimeManager destroyed without calling Terminate!");
|
|
}
|
|
|
|
llvm::Error SystemLifetimeManager::Initialize(
|
|
std::unique_ptr<SystemInitializer> initializer) {
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
|
if (!m_initializer) {
|
|
m_initialized++;
|
|
m_initializer = std::move(initializer);
|
|
|
|
if (auto e = m_initializer->Initialize())
|
|
return e;
|
|
}
|
|
|
|
return llvm::Error::success();
|
|
}
|
|
|
|
void SystemLifetimeManager::Terminate() {
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
|
|
|
if (m_initializer) {
|
|
m_initializer->Terminate();
|
|
m_initializer.reset();
|
|
m_terminated++;
|
|
}
|
|
}
|