forked from dogecoin/dogecoin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
threads: add utilthread.h/.cpp, utilthreadnames.h/.cpp and add to syn…
…c.cpp
- Loading branch information
Showing
6 changed files
with
143 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ | |
|
||
#include "util.h" | ||
#include "utilstrencodings.h" | ||
#include "utilthreadnames.h" | ||
|
||
#include <stdio.h> | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |