[lldb] Flush the global thread pool in Debugger::Terminate

Use the Initialize/Terminate pattern for the global thread pool to make
sure it gets flushed during teardown.

Differential revision: https://reviews.llvm.org/D131407
This commit is contained in:
Jonas Devlieghere 2022-08-15 17:22:14 -07:00
parent df2213f345
commit 8d36a82d0a
No known key found for this signature in database
GPG Key ID: 49CC0BD90FDEED4D
1 changed files with 9 additions and 6 deletions

View File

@ -104,6 +104,7 @@ static std::recursive_mutex *g_debugger_list_mutex_ptr =
nullptr; // NOTE: intentional leak to avoid issues with C++ destructor chain
static DebuggerList *g_debugger_list_ptr =
nullptr; // NOTE: intentional leak to avoid issues with C++ destructor chain
static llvm::ThreadPool *g_thread_pool = nullptr;
static constexpr OptionEnumValueElement g_show_disassembly_enum_values[] = {
{
@ -538,6 +539,7 @@ void Debugger::Initialize(LoadPluginCallbackType load_plugin_callback) {
"Debugger::Initialize called more than once!");
g_debugger_list_mutex_ptr = new std::recursive_mutex();
g_debugger_list_ptr = new DebuggerList();
g_thread_pool = new llvm::ThreadPool(llvm::optimal_concurrency());
g_load_plugin_callback = load_plugin_callback;
}
@ -545,6 +547,11 @@ void Debugger::Terminate() {
assert(g_debugger_list_ptr &&
"Debugger::Terminate called without a matching Debugger::Initialize!");
if (g_thread_pool) {
// The destructor will wait for all the threads to complete.
delete g_thread_pool;
}
if (g_debugger_list_ptr && g_debugger_list_mutex_ptr) {
// Clear our global list of debugger objects
{
@ -2005,11 +2012,7 @@ Status Debugger::RunREPL(LanguageType language, const char *repl_options) {
}
llvm::ThreadPool &Debugger::GetThreadPool() {
// NOTE: intentional leak to avoid issues with C++ destructor chain
static llvm::ThreadPool *g_thread_pool = nullptr;
static llvm::once_flag g_once_flag;
llvm::call_once(g_once_flag, []() {
g_thread_pool = new llvm::ThreadPool(llvm::optimal_concurrency());
});
assert(g_thread_pool &&
"Debugger::GetThreadPool called before Debugger::Initialize");
return *g_thread_pool;
}