<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.

</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/f1488baef95e8d18a1c95e09e8d2a9122ce84128">https://github.com/macports/macports-legacy-support/commit/f1488baef95e8d18a1c95e09e8d2a9122ce84128</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit f1488baef95e8d18a1c95e09e8d2a9122ce84128
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Fri Nov 15 15:50:16 2024 -0800

<span style='display:block; white-space:pre;color:#404040;'>    pthread_get_stacksize_np: Cache dlsym() result.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This avoids repeatedly looking up the symbol for the OS call.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also cleans up indentation.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'>    Passes tests on all platforms.
</span>---
 src/pthread_get_stacksize_np.c | 50 +++++++++++++++++++++++-------------------
 1 file changed, 27 insertions(+), 23 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pthread_get_stacksize_np.c b/src/pthread_get_stacksize_np.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 1bbd720..4ffb38b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/pthread_get_stacksize_np.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pthread_get_stacksize_np.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -43,29 +43,33 @@ size_t pthread_get_stacksize_np(pthread_t t) {
</span>      } *thread = (void*) t;
      int is_main_thread = ((thread->detached & 4) == 4);
 #endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-     if ( is_main_thread ) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* use LLVM workaround */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* see https://github.com/llvm/llvm-project/blob/617a15a9eac96088ae5e9134248d8236e34b91b1/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp#L414 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         /* OpenJDK also has a workaround */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         /* see https://github.com/openjdk/jdk/blob/e833bfc8ac6104522d037e7eb300f5aa112688bb/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp#L715 */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     struct rlimit limit;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if( getrlimit(RLIMIT_STACK, &limit) ) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          exit(EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if( limit.rlim_cur < kMaxThreadStackSize ) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          return limit.rlim_cur;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          return kMaxThreadStackSize;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* bug only affects main thread */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     size_t (*real_pthread_get_stacksize_np)(pthread_t);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     real_pthread_get_stacksize_np = dlsym(RTLD_NEXT, "pthread_get_stacksize_np");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (real_pthread_get_stacksize_np == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-          exit(EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     return real_pthread_get_stacksize_np(t);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if ( is_main_thread ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* use LLVM workaround */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* see https://github.com/llvm/llvm-project/blob/617a15a9eac96088ae5e9134248d8236e34b91b1/compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp#L414 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       /* OpenJDK also has a workaround */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       /* see https://github.com/openjdk/jdk/blob/e833bfc8ac6104522d037e7eb300f5aa112688bb/src/hotspot/os_cpu/bsd_x86/os_bsd_x86.cpp#L715 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        struct rlimit limit;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if( getrlimit(RLIMIT_STACK, &limit) ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             exit(EXIT_FAILURE);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if( limit.rlim_cur < kMaxThreadStackSize ) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return limit.rlim_cur;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+             return kMaxThreadStackSize;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        /* bug only affects main thread */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        static size_t (*os_pthread_get_stacksize_np)(pthread_t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!os_pthread_get_stacksize_np) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            os_pthread_get_stacksize_np =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dlsym(RTLD_NEXT, "pthread_get_stacksize_np");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            /* Something's badly broken if this fails */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if (!os_pthread_get_stacksize_np) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                abort();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return (*os_pthread_get_stacksize_np)(t);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> }
 
 #endif /* __MPLS_LIB_SUPPORT_PTHREAD_GET_STACKSIZE_NP_FIX__ */
</pre><pre style='margin:0'>

</pre>