Skip to content

Commit

Permalink
threads: add utilthread.h/.cpp, utilthreadnames.h/.cpp and add to syn…
Browse files Browse the repository at this point in the history
…c.cpp
  • Loading branch information
xanimo committed Feb 1, 2025
1 parent cb8fc77 commit 0d0a122
Show file tree
Hide file tree
Showing 6 changed files with 143 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ BITCOIN_CORE_H = \
util.h \
utilmemory.h \
utilmoneystr.h \
utilthread.h \
utilthreadnames.h \
utiltime.h \
utilstring.h \
validation.h \
Expand Down Expand Up @@ -377,6 +379,8 @@ libdogecoin_util_a_SOURCES = \
util.cpp \
utilmoneystr.cpp \
utilstrencodings.cpp \
utilthread.cpp \
utilthreadnames.cpp \
utiltime.cpp \
$(BITCOIN_CORE_H)

Expand Down
1 change: 1 addition & 0 deletions src/sync.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "util.h"
#include "utilstrencodings.h"
#include "utilthreadnames.h"

#include <stdio.h>

Expand Down
26 changes: 26 additions & 0 deletions src/utilthread.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright (c) 2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <utilthread.h>

#include <util.h>
#include <utilthreadnames.h>

#include <exception>

void util::TraceThread(const char* thread_name, std::function<void()> thread_func)
{
util::ThreadRename(thread_name);
try {
LogPrintf("%s thread start\n", thread_name);
thread_func();
LogPrintf("%s thread exit\n", thread_name);
} catch (const std::exception& e) {
PrintExceptionContinue(&e, thread_name);
throw;
} catch (...) {
PrintExceptionContinue(nullptr, thread_name);
throw;
}
}
18 changes: 18 additions & 0 deletions src/utilthread.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright (c) 2021 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#ifndef BITCOIN_UTILTHREAD_H
#define BITCOIN_UTILTHREAD_H

#include <functional>

namespace util {
/**
* A wrapper for do-something-once thread functions.
*/
void TraceThread(const char* thread_name, std::function<void()> thread_func);

} // namespace util

#endif // BITCOIN_UTILTHREAD_H
68 changes: 68 additions & 0 deletions src/utilthreadnames.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright (c) 2018-2019 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#if defined(HAVE_CONFIG_H)
#include <config/bitcoin-config.h>
#endif

#include <string>
#include <thread>
#include <utility>

#if (defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__))
#include <pthread.h>
#include <pthread_np.h>
#endif

#include <utilthreadnames.h>

#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
#endif

//! Set the thread's name at the process level. Does not affect the
//! internal name.
static void SetThreadName(const char* name)
{
#if defined(PR_SET_NAME)
// Only the first 15 characters are used (16 - NUL terminator)
::prctl(PR_SET_NAME, name, 0, 0, 0);
#elif (defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__))
pthread_set_name_np(pthread_self(), name);
#elif defined(MAC_OSX)
pthread_setname_np(name);
#else
// Prevent warnings for unused parameters...
(void)name;
#endif
}

// If we have thread_local, just keep thread ID and name in a thread_local
// global.
#if defined(HAVE_THREAD_LOCAL)

static thread_local std::string g_thread_name;
const std::string& util::ThreadGetInternalName() { return g_thread_name; }
//! Set the in-memory internal name for this thread. Does not affect the process
//! name.
static void SetInternalName(std::string name) { g_thread_name = std::move(name); }

// Without thread_local available, don't handle internal name at all.
#else

static const std::string empty_string;
const std::string& util::ThreadGetInternalName() { return empty_string; }
static void SetInternalName(std::string name) { }
#endif

void util::ThreadRename(std::string&& name)
{
SetThreadName(("b-" + name).c_str());
SetInternalName(std::move(name));
}

void util::ThreadSetInternalName(std::string&& name)
{
SetInternalName(std::move(name));
}
26 changes: 26 additions & 0 deletions src/utilthreadnames.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright (c) 2018-2019 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#ifndef BITCOIN_UTILTHREADNAMES_H
#define BITCOIN_UTILTHREADNAMES_H

#include <string>

namespace util {
//! Rename a thread both in terms of an internal (in-memory) name as well
//! as its system thread name.
//! @note Do not call this for the main thread, as this will interfere with
//! UNIX utilities such as top and killall. Use ThreadSetInternalName instead.
void ThreadRename(std::string&&);

//! Set the internal (in-memory) name of the current thread only.
void ThreadSetInternalName(std::string&&);

//! Get the thread's internal (in-memory) name; used e.g. for identification in
//! logging.
const std::string& ThreadGetInternalName();

} // namespace util

#endif // BITCOIN_UTILTHREADNAMES_H

0 comments on commit 0d0a122

Please sign in to comment.