diff --git a/rx/CMakeLists.txt b/rx/CMakeLists.txt index 7ef83bc46..aef9b800e 100644 --- a/rx/CMakeLists.txt +++ b/rx/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(${PROJECT_NAME} OBJECT src/FileLock.cpp src/hexdump.cpp src/mem.cpp + src/Process.cpp src/SharedAtomic.cpp src/SharedCV.cpp src/SharedMutex.cpp @@ -22,6 +23,10 @@ PRIVATE include/${PROJECT_NAME} ) +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + target_link_libraries(${PROJECT_NAME} PUBLIC synchronization kernel32 onecore) +endif() + target_link_libraries(${PROJECT_NAME} PUBLIC fmt::fmt) if (Git_FOUND) diff --git a/rx/include/rx/Process.hpp b/rx/include/rx/Process.hpp new file mode 100644 index 000000000..8a135a199 --- /dev/null +++ b/rx/include/rx/Process.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +namespace rx { +using ProcessId = std::uint32_t; + +#ifdef __APPLE__ +using ThreadId = std::uint64_t; +#else +using ThreadId = ProcessId; +#endif + +#ifdef _WIN32 +using ProcessHandle = void *; +#else +using ProcessHandle = ProcessId; +#endif + +#if defined(_WIN32) || defined(__APPLE__) +using ThreadHandle = void *; +#else +using ThreadHandle = ThreadId; +#endif + +ProcessId getCurrentProcessId(); +ThreadId getCurrentThreadId(); +ProcessHandle getCurrentProcessHandle(); +ThreadHandle getCurrentThreadHandle(); +} // namespace rx diff --git a/rx/src/Process.cpp b/rx/src/Process.cpp new file mode 100644 index 000000000..ac4319ce0 --- /dev/null +++ b/rx/src/Process.cpp @@ -0,0 +1,50 @@ +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#else +#include +#endif + +#ifdef __APPLE__ +#include +#endif + +rx::ProcessId rx::getCurrentProcessId() { +#ifdef _WIN32 + return ::GetCurrentProcessId(); +#else + return ::getpid(); +#endif +} + +rx::ThreadId rx::getCurrentThreadId() { +#ifdef _WIN32 + return ::GetCurrentProcessId(); +#elif defined(__APPLE__) + uint64_t tid = 0; + pthread_threadid_np(nullptr, &tid); + return tid; +#else + return ::gettid(); +#endif +} + +rx::ProcessHandle rx::getCurrentProcessHandle() { +#ifdef _WIN32 + return ::GetCurrentProcess(); +#else + return getCurrentProcessId(); +#endif +} + +rx::ThreadHandle rx::getCurrentThreadHandle() { +#ifdef _WIN32 + return ::GetCurrentThread(); +#elif defined(__APPLE__) + return pthread_self(); +#else + return getCurrentThreadId(); +#endif +} diff --git a/rx/src/debug.cpp b/rx/src/debug.cpp index 1727b2c7a..eed39bf1b 100644 --- a/rx/src/debug.cpp +++ b/rx/src/debug.cpp @@ -1,4 +1,5 @@ #include "debug.hpp" +#include "Process.hpp" #include "print.hpp" #include #include @@ -73,7 +74,7 @@ void rx::waitForDebugger() { return; } - rx::println(stderr, "waiting for debugger, pid {}", ::getpid()); + rx::println(stderr, "waiting for debugger, pid {}", getCurrentProcessId()); while (!isDebuggerPresent()) { std::this_thread::sleep_for(std::chrono::seconds(1));