]> git.proxmox.com Git - wasi-libc.git/commitdiff
Add support for pthread_getattr_np (#470)
authorMilek7 <Milek7@users.noreply.github.com>
Mon, 11 Mar 2024 15:48:13 +0000 (16:48 +0100)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Tue, 25 Jun 2024 10:13:35 +0000 (12:13 +0200)
Makefile
expected/wasm32-wasip1-threads/defined-symbols.txt
libc-top-half/musl/src/env/__init_tls.c
libc-top-half/musl/src/thread/pthread_getattr_np.c

index c1a1ad27ec7ab1c22c2cff3c93428222c94272e4..9137d996d0e12eb3b536b6bdb99bd922d42d704c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -258,6 +258,7 @@ LIBC_TOP_HALF_MUSL_SOURCES += \
         thread/pthread_create.c \
         thread/pthread_detach.c \
         thread/pthread_equal.c \
+        thread/pthread_getattr_np.c \
         thread/pthread_getspecific.c \
         thread/pthread_join.c \
         thread/pthread_key_create.c \
index 22d6fec60197c6c8192e9f5843e2782bbcd876b4..f3fc6d4a7c980f2c894a344e4d67b43d7b3c02bd 100644 (file)
@@ -1010,6 +1010,7 @@ pthread_condattr_setpshared
 pthread_create
 pthread_detach
 pthread_equal
+pthread_getattr_np
 pthread_getspecific
 pthread_join
 pthread_key_create
index c3e407c870219940f9d7b1b3a2e95e0511095462..4f4c2217148f5702a2a680b707efbc001d59664f 100644 (file)
@@ -31,25 +31,35 @@ extern unsigned char __global_base;
 extern weak unsigned char __stack_high;
 extern weak unsigned char __stack_low;
 
-static inline void setup_default_stack_size()
+struct stack_bounds {
+       void *base;
+       size_t size;
+};
+
+static inline struct stack_bounds get_stack_bounds()
 {
-       ptrdiff_t stack_size;
+       struct stack_bounds bounds;
 
-       if (&__stack_high)
-               stack_size = &__stack_high - &__stack_low;
-       else {
+       if (&__stack_high) {
+               bounds.base = &__stack_high;
+               bounds.size = &__stack_high - &__stack_low;
+       } else {
                unsigned char *sp;
                __asm__(
                        ".globaltype __stack_pointer, i32\n"
                        "global.get __stack_pointer\n"
                        "local.set %0\n"
                        : "=r"(sp));
-               stack_size = sp > &__global_base ? &__heap_base - &__data_end : (ptrdiff_t)&__global_base;
+               if (sp > &__global_base) {
+                       bounds.base = &__heap_base;
+                       bounds.size = &__heap_base - &__data_end;
+               } else {
+                       bounds.base = &__global_base;
+                       bounds.size = (size_t)&__global_base;
+               }
        }
 
-       __default_stacksize =
-               stack_size < DEFAULT_STACK_MAX ?
-               stack_size : DEFAULT_STACK_MAX;
+       return bounds;
 }
 
 void __wasi_init_tp() {
@@ -68,8 +78,14 @@ int __init_tp(void *p)
        td->detach_state = DT_JOINABLE;
        td->tid = __syscall(SYS_set_tid_address, &__thread_list_lock);
 #else
-       setup_default_stack_size();
+       struct stack_bounds bounds = get_stack_bounds();
+       __default_stacksize =
+               bounds.size < DEFAULT_STACK_MAX ?
+               bounds.size : DEFAULT_STACK_MAX;
        td->detach_state = DT_JOINABLE;
+       td->stack = bounds.base;
+       td->stack_size = bounds.size;
+       td->guard_size = 0;
        /*
         * Initialize the TID to a value which doesn't conflict with
         * host-allocated TIDs, so that TID-based locks can work.
index 2881831f8c2fa32d89f4caf9c61b7243644bf403..c23e5d75d7c5fb02653b75e0982eb847c714230a 100644 (file)
@@ -1,7 +1,9 @@
 #define _GNU_SOURCE
 #include "pthread_impl.h"
 #include "libc.h"
+#ifdef __wasilibc_unmodified_upstream
 #include <sys/mman.h>
+#endif
 
 int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
 {
@@ -12,6 +14,7 @@ int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
                a->_a_stackaddr = (uintptr_t)t->stack;
                a->_a_stacksize = t->stack_size;
        } else {
+#ifdef __wasilibc_unmodified_upstream
                char *p = (void *)libc.auxv;
                size_t l = PAGE_SIZE;
                p += -(uintptr_t)p & PAGE_SIZE-1;
@@ -19,6 +22,9 @@ int pthread_getattr_np(pthread_t t, pthread_attr_t *a)
                while (mremap(p-l-PAGE_SIZE, PAGE_SIZE, 2*PAGE_SIZE, 0)==MAP_FAILED && errno==ENOMEM)
                        l += PAGE_SIZE;
                a->_a_stacksize = l;
+#else
+               return ENOSYS;
+#endif
        }
        return 0;
 }