From 45177129a75c5bfd03933b82076e8dc49acc500f Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 24 May 2022 20:26:18 +0900 Subject: [PATCH] Support old Mac OS X SDK and gcc Follow up of https://github.com/ruby/ruby/pull/5927 `pthread_threadid_np()` is not even be declared in outdated SDKs. Also, the `__API_AVAILABLE` macro does not work on gcc, which does not support the [availability] attribute of clang, so an additional weak symbol declaration is required to check for weakly linked symbols. [availability]: https://clang.llvm.org/docs/AttributeReference.html#availability --- thread_pthread.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/thread_pthread.c b/thread_pthread.c index 5c181556b9..125cf57c77 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -1761,13 +1761,28 @@ native_thread_native_thread_id(rb_thread_t *target_th) return INT2FIX(tid); #elif defined(__APPLE__) uint64_t tid; - if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 || - !&pthread_threadid_np /* check weakly linked symbol */) { +# if ((MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6) || \ + defined(__POWERPC__) /* never defined for PowerPC platforms */) + const bool no_pthread_threadid_np = true; +# define NO_PTHREAD_MACH_THREAD_NP 1 +# elif MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + const bool no_pthread_threadid_np = false; +# else +# if !(defined(__has_attribute) && __has_attribute(availability)) + /* __API_AVAILABLE macro does nothing on gcc */ + __attribute__((weak)) int pthread_threadid_np(pthread_t, uint64_t*); +# endif + /* Check weakly linked symbol */ + const bool no_pthread_threadid_np = !&pthread_threadid_np; +# endif + if (no_pthread_threadid_np) { return ULL2NUM(pthread_mach_thread_np(pthread_self())); } +# ifndef NO_PTHREAD_MACH_THREAD_NP int e = pthread_threadid_np(target_th->nt->thread_id, &tid); if (e != 0) rb_syserr_fail(e, "pthread_threadid_np"); return ULL2NUM((unsigned long long)tid); +# endif #endif } # define USE_NATIVE_THREAD_NATIVE_THREAD_ID 1