--- thread_pthread.c.orig 2022-04-12 19:11:15.000000000 +0800 +++ thread_pthread.c 2022-10-24 05:26:46.000000000 +0800 @@ -40,6 +40,10 @@ #include #include +#if defined __APPLE__ +# include +#endif + #if defined(HAVE_SYS_EVENTFD_H) && defined(HAVE_EVENTFD) # define USE_EVENTFD (1) # include @@ -1732,9 +1736,29 @@ return INT2FIX(tid); #elif defined(__APPLE__) uint64_t tid; - int e = pthread_threadid_np(target_th->thread_id, &tid); +# if (!defined(MAC_OS_X_VERSION_10_6) || \ + (MAC_OS_X_VERSION_MAX_ALLOWED < 1060) || \ + 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 >= 1060 + 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->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