<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>