mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 07:00:20 +02:00
Merge pull request #5937 from Sonicadvance1/238
Threads: Support setting thread names through creation
This commit is contained in:
7 files changed
+32
-15
No files matched your search
@@ -459,7 +459,7 @@ namespace DiskCache {
|
||||
|
||||
if (IsWritingDiskCache()) {
|
||||
FEXCore::Threads::Flags WriterThreadFlags = {.LowPriority = true, .Internal = true};
|
||||
Writer = fextl::make_unique<WorkQueueThread>(WriterThreadFlags);
|
||||
Writer = fextl::make_unique<WorkQueueThread>(WriterThreadFlags, "FEX:DiskCache");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
#include <unistd.h>
|
||||
|
||||
namespace FEXCore::Threads {
|
||||
static fextl::unique_ptr<FEXCore::Threads::Thread> CreateThread_Default(ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags) {
|
||||
static fextl::unique_ptr<FEXCore::Threads::Thread>
|
||||
CreateThread_Default(ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags, const char* ThreadName) {
|
||||
ERROR_AND_DIE_FMT("Frontend didn't setup thread creation!");
|
||||
}
|
||||
|
||||
@@ -20,8 +21,9 @@ static FEXCore::Threads::Pointers Ptrs = {
|
||||
.CleanupAfterFork = CleanupAfterFork_Default,
|
||||
};
|
||||
|
||||
fextl::unique_ptr<FEXCore::Threads::Thread> FEXCore::Threads::Thread::Create(ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags) {
|
||||
return Ptrs.CreateThread(Func, Arg, Flags);
|
||||
fextl::unique_ptr<FEXCore::Threads::Thread>
|
||||
FEXCore::Threads::Thread::Create(ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags, const char* ThreadName) {
|
||||
return Ptrs.CreateThread(Func, Arg, Flags, ThreadName);
|
||||
}
|
||||
|
||||
void FEXCore::Threads::Thread::CleanupAfterFork() {
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
namespace FEXCore {
|
||||
|
||||
WorkQueueThread::WorkQueueThread(FEXCore::Threads::Flags ThreadFlags) {
|
||||
Thread = FEXCore::Threads::Thread::Create(ThreadEntry, this, ThreadFlags);
|
||||
WorkQueueThread::WorkQueueThread(FEXCore::Threads::Flags ThreadFlags, const char* ThreadName) {
|
||||
Thread = FEXCore::Threads::Thread::Create(ThreadEntry, this, ThreadFlags, ThreadName);
|
||||
}
|
||||
|
||||
WorkQueueThread::~WorkQueueThread() {
|
||||
|
||||
@@ -13,7 +13,7 @@ struct Flags {
|
||||
using ThreadFunc = void* (*)(void* user_ptr);
|
||||
|
||||
class Thread;
|
||||
using CreateThreadFunc = fextl::unique_ptr<Thread> (*)(ThreadFunc Func, void* Arg, Flags Flags);
|
||||
using CreateThreadFunc = fextl::unique_ptr<Thread> (*)(ThreadFunc Func, void* Arg, Flags Flags, const char* ThreadName);
|
||||
using CleanupAfterForkFunc = void (*)();
|
||||
|
||||
struct Pointers {
|
||||
@@ -34,7 +34,7 @@ public:
|
||||
* @name Calls provided API functions
|
||||
* @{ */
|
||||
|
||||
static fextl::unique_ptr<Thread> Create(ThreadFunc Func, void* Arg, Flags Flags = {});
|
||||
static fextl::unique_ptr<Thread> Create(ThreadFunc Func, void* Arg, Flags Flags = {}, const char* ThreadName = nullptr);
|
||||
|
||||
static void CleanupAfterFork();
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ public:
|
||||
virtual void Run() = 0;
|
||||
};
|
||||
|
||||
WorkQueueThread(FEXCore::Threads::Flags Flags = {});
|
||||
WorkQueueThread(FEXCore::Threads::Flags Flags = {}, const char* ThreadName = nullptr);
|
||||
~WorkQueueThread();
|
||||
|
||||
void QueueWork(fextl::unique_ptr<WorkItem> Work);
|
||||
|
||||
@@ -197,7 +197,7 @@ namespace PThreads {
|
||||
|
||||
class PThread final : public FEXCore::Threads::Thread {
|
||||
public:
|
||||
PThread(StackTracker* STracker, FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags)
|
||||
PThread(StackTracker* STracker, FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags, const char* ThreadName)
|
||||
: STracker {STracker}
|
||||
, UserFunc {Func}
|
||||
, UserArg {Arg}
|
||||
@@ -226,6 +226,9 @@ namespace PThreads {
|
||||
HLE::ThreadManager::SetSignalMask(OldMask);
|
||||
}
|
||||
pthread_attr_destroy(&Attr);
|
||||
if (ThreadName) {
|
||||
pthread_setname_np(Thread, ThreadName);
|
||||
}
|
||||
}
|
||||
|
||||
bool joinable() override {
|
||||
@@ -375,8 +378,8 @@ namespace PThreads {
|
||||
static StackTracker* STracker {};
|
||||
|
||||
static fextl::unique_ptr<FEXCore::Threads::Thread>
|
||||
CreateThread_PThread(FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags) {
|
||||
return fextl::make_unique<PThread>(STracker, Func, Arg, Flags);
|
||||
CreateThread_PThread(FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags, const char* ThreadName) {
|
||||
return fextl::make_unique<PThread>(STracker, Func, Arg, Flags, ThreadName);
|
||||
}
|
||||
|
||||
static void CleanupAfterFork_PThread() {
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace FEX::Windows {
|
||||
namespace WinThreadImpl {
|
||||
class Thread final : public FEXCore::Threads::Thread {
|
||||
public:
|
||||
Thread(FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags)
|
||||
Thread(FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags, const char* ThreadName)
|
||||
: UserFunc {Func}
|
||||
, UserArg {Arg}
|
||||
, Flags {Flags} {
|
||||
@@ -28,6 +28,17 @@ namespace WinThreadImpl {
|
||||
LogMan::Msg::EFmt("NtCreateThreadEx failed: 0x{:x}", static_cast<uint32_t>(Status));
|
||||
Handle = nullptr;
|
||||
}
|
||||
|
||||
if (ThreadName) {
|
||||
UNICODE_STRING ThreadNameW;
|
||||
if (RtlCreateUnicodeStringFromAsciiz(&ThreadNameW, ThreadName)) {
|
||||
THREAD_NAME_INFORMATION info {
|
||||
.ThreadName = ThreadNameW,
|
||||
};
|
||||
NtSetInformationThread(Handle, static_cast<THREADINFOCLASS>(38) /* ThreadNameInformation */, &info, sizeof(info));
|
||||
RtlFreeUnicodeString(&ThreadNameW);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool joinable() override {
|
||||
@@ -90,8 +101,9 @@ namespace WinThreadImpl {
|
||||
void* ReturnValue {};
|
||||
};
|
||||
|
||||
fextl::unique_ptr<FEXCore::Threads::Thread> CreateThread(FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags) {
|
||||
return fextl::make_unique<Thread>(Func, Arg, Flags);
|
||||
fextl::unique_ptr<FEXCore::Threads::Thread>
|
||||
CreateThread(FEXCore::Threads::ThreadFunc Func, void* Arg, FEXCore::Threads::Flags Flags, const char* ThreadName) {
|
||||
return fextl::make_unique<Thread>(Func, Arg, Flags, ThreadName);
|
||||
}
|
||||
|
||||
void CleanupAfterFork() {}
|
||||
|
||||
Reference in new issue
Block a user