From 6ebcf46faef6cff66d4d1692d72c05284a476f4e Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 9 Apr 2026 11:38:30 +0000 Subject: [PATCH 1/2] Haiku: Fix native component build This contains the missing configuration updates required to build the native component for Haiku with the latest .NET source. --- eng/native/configurecompiler.cmake | 6 +++++- src/native/libs/Common/pal_config.h.in | 2 ++ src/native/libs/System.Native/pal_crossprocessmutex.c | 4 ++++ src/native/libs/configure.cmake | 2 ++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index ace8fd5fe426f3..b967bf81282365 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -350,8 +350,12 @@ elseif(CLR_CMAKE_HOST_APPLE) endif() endif() elseif(CLR_CMAKE_HOST_HAIKU) + # Workaround until https://gitlab.kitware.com/cmake/cmake/-/merge_requests/11915 gets merged. + # Haiku uses the GNU toolchain so this should work. + set(CMAKE_LINK_GROUP_USING_RESCAN "LINKER:--start-group" "LINKER:--end-group") + set(CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED TRUE) add_compile_options($<$:-Wa,--noexecstack>) - add_linker_flag("-Wl,--no-undefined") + add_linker_flag("-Wl,--build-id=sha1") endif() #------------------------------------ diff --git a/src/native/libs/Common/pal_config.h.in b/src/native/libs/Common/pal_config.h.in index b546abba1c91c3..64dd893fa43035 100644 --- a/src/native/libs/Common/pal_config.h.in +++ b/src/native/libs/Common/pal_config.h.in @@ -105,6 +105,8 @@ #cmakedefine01 HAVE_CLOCK_GETTIME_NSEC_NP #cmakedefine01 HAVE_PTHREAD_CONDATTR_SETCLOCK #cmakedefine01 HAVE_PTHREAD_MUTEX_CLOCKLOCK +#cmakedefine01 HAVE_PTHREAD_MUTEX_CONSISTENT +#cmakedefine01 HAVE_PTHREAD_MUTEXATTR_SETROBUST #cmakedefine01 HAVE_TCP_H_TCPSTATE_ENUM #cmakedefine01 HAVE_TCP_FSM_H #cmakedefine01 HAVE_GSSFW_HEADERS diff --git a/src/native/libs/System.Native/pal_crossprocessmutex.c b/src/native/libs/System.Native/pal_crossprocessmutex.c index 0d18731c6e9f8c..6575ae71a505a8 100644 --- a/src/native/libs/System.Native/pal_crossprocessmutex.c +++ b/src/native/libs/System.Native/pal_crossprocessmutex.c @@ -100,8 +100,10 @@ int32_t SystemNative_LowLevelCrossProcessMutex_Init(LowLevelCrossProcessMutex* m error = pthread_mutexattr_settype(&mutexAttributes, PTHREAD_MUTEX_RECURSIVE); assert(error == 0); +#if HAVE_PTHREAD_MUTEXATTR_SETROBUST error = pthread_mutexattr_setrobust(&mutexAttributes, PTHREAD_MUTEX_ROBUST); assert(error == 0); +#endif error = pthread_mutexattr_setpshared(&mutexAttributes, PTHREAD_PROCESS_SHARED); assert(error == 0); @@ -114,12 +116,14 @@ int32_t SystemNative_LowLevelCrossProcessMutex_Acquire(LowLevelCrossProcessMutex { int32_t result = AcquirePThreadMutexWithTimeout(&mutex->Mutex, timeoutMilliseconds); +#if HAVE_PTHREAD_MUTEX_CONSISTENT if (result == EOWNERDEAD) { // The mutex was abandoned by the previous owner. // Make it consistent so that it can be used again. int setConsistentResult = pthread_mutex_consistent(&mutex->Mutex); } +#endif return ConvertErrorPlatformToPal(result); } diff --git a/src/native/libs/configure.cmake b/src/native/libs/configure.cmake index d5fbbc082dd3d4..3e33a39c0caf13 100644 --- a/src/native/libs/configure.cmake +++ b/src/native/libs/configure.cmake @@ -663,6 +663,8 @@ endif() if (NOT CLR_CMAKE_TARGET_WASI) check_library_exists(${PTHREAD_LIBRARY} pthread_condattr_setclock "" HAVE_PTHREAD_CONDATTR_SETCLOCK) check_library_exists(${PTHREAD_LIBRARY} pthread_mutex_clocklock "" HAVE_PTHREAD_MUTEX_CLOCKLOCK) + check_library_exists(${PTHREAD_LIBRARY} pthread_mutex_consistent "" HAVE_PTHREAD_MUTEX_CONSISTENT) + check_library_exists(${PTHREAD_LIBRARY} pthread_mutexattr_setrobust "" HAVE_PTHREAD_MUTEXATTR_SETROBUST) endif() check_symbol_exists( From 544eeecc1ef0e24d8dd4b7c57942983e65316b00 Mon Sep 17 00:00:00 2001 From: Trung Nguyen <57174311+trungnt2910@users.noreply.github.com> Date: Mon, 13 Apr 2026 11:19:12 +0000 Subject: [PATCH 2/2] Haiku: Fall back to unsupported mutex C file Instead of guarding for robust mutexes in `pal_crossprocessmutex.c`, guard them in the `CMakeLists.txt` so that platforms without these can fall back to the stubbed implementation on unsupported platforms. --- src/native/libs/System.Native/CMakeLists.txt | 3 ++- src/native/libs/System.Native/pal_crossprocessmutex.c | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/native/libs/System.Native/CMakeLists.txt b/src/native/libs/System.Native/CMakeLists.txt index 8fa04ec15a9c9e..f97c8e77f7d3c3 100644 --- a/src/native/libs/System.Native/CMakeLists.txt +++ b/src/native/libs/System.Native/CMakeLists.txt @@ -56,7 +56,8 @@ else() # WASI ) endif() -if (CLR_CMAKE_TARGET_APPLE OR CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI OR CLR_CMAKE_TARGET_OPENBSD) +if (CLR_CMAKE_TARGET_APPLE OR CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI OR CLR_CMAKE_TARGET_OPENBSD + OR NOT HAVE_PTHREAD_MUTEXATTR_SETROBUST OR NOT HAVE_PTHREAD_MUTEX_CONSISTENT) list (APPEND NATIVE_SOURCES pal_crossprocessmutex_unsupported.c) else() diff --git a/src/native/libs/System.Native/pal_crossprocessmutex.c b/src/native/libs/System.Native/pal_crossprocessmutex.c index 6575ae71a505a8..0d18731c6e9f8c 100644 --- a/src/native/libs/System.Native/pal_crossprocessmutex.c +++ b/src/native/libs/System.Native/pal_crossprocessmutex.c @@ -100,10 +100,8 @@ int32_t SystemNative_LowLevelCrossProcessMutex_Init(LowLevelCrossProcessMutex* m error = pthread_mutexattr_settype(&mutexAttributes, PTHREAD_MUTEX_RECURSIVE); assert(error == 0); -#if HAVE_PTHREAD_MUTEXATTR_SETROBUST error = pthread_mutexattr_setrobust(&mutexAttributes, PTHREAD_MUTEX_ROBUST); assert(error == 0); -#endif error = pthread_mutexattr_setpshared(&mutexAttributes, PTHREAD_PROCESS_SHARED); assert(error == 0); @@ -116,14 +114,12 @@ int32_t SystemNative_LowLevelCrossProcessMutex_Acquire(LowLevelCrossProcessMutex { int32_t result = AcquirePThreadMutexWithTimeout(&mutex->Mutex, timeoutMilliseconds); -#if HAVE_PTHREAD_MUTEX_CONSISTENT if (result == EOWNERDEAD) { // The mutex was abandoned by the previous owner. // Make it consistent so that it can be used again. int setConsistentResult = pthread_mutex_consistent(&mutex->Mutex); } -#endif return ConvertErrorPlatformToPal(result); }