Files
AronaCore/core/misc/platform_thread.h

49 lines
1.4 KiB
C++

#include <iostream>
#include <thread>
#if PLATFORM_WINDOWS
#include <windows.h>
#include <processthreadsapi.h>
#elif PLATFORM_LINUX
#include <pthread.h>
#elif PLATFORM_MACOS
#include <pthread.h>
#include <mach/thread_policy.h>
#include <mach/thread_act.h>
#endif
inline void set_thread_name(const char* name) {
#if PLATFORM_WINDOWS
SetThreadDescription(GetCurrentThread(), std::wstring(name, name + strlen(name)).c_str());
#elif PLATFORM_LINUX
pthread_setname_np(pthread_self(), name);
#elif PLATFORM_MACOS
pthread_setname_np(name);
#endif
}
inline void set_thread_affinity(std::thread& thread, int core) {
#if PLATFORM_WINDOWS
const auto handle = reinterpret_cast<HANDLE>(thread.native_handle());
SetThreadAffinityMask(handle, 1 << core);
#elif PLATFORM_LINUX
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core, &cpuset);
pthread_setaffinity_np(thread.native_handle(), sizeof(cpu_set_t), &cpuset);
#elif PLATFORM_MACOS
thread_affinity_policy_data_t policy = { core };
kern_return_t result = thread_policy_set(
pthread_mach_thread_np(thread.native_handle()),
THREAD_AFFINITY_POLICY,
(thread_policy_t)&policy,
THREAD_AFFINITY_POLICY_COUNT
);
if (result != KERN_SUCCESS) {
spdlog::error("Failed to set thread affinity: {}", result);
} else {
spdlog::info("Thread bound to core {}", core);
}
#endif
}