[前][次][番号順一覧][スレッド一覧]

ruby-changes:71978

From: Nobuyoshi <ko1@a...>
Date: Fri, 27 May 2022 16:25:04 +0900 (JST)
Subject: [ruby-changes:71978] 45177129a7 (master): Support old Mac OS X SDK and gcc

https://git.ruby-lang.org/ruby.git/commit/?id=45177129a7

From 45177129a75c5bfd03933b82076e8dc49acc500f Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Tue, 24 May 2022 20:26:18 +0900
Subject: 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) https://github.com/ruby/ruby/blob/trunk/thread_pthread.c#L1761
     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
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]