Add support for pthread_getattr_np (#470)

This commit is contained in:
Milek7 2024-03-11 16:48:13 +01:00 committed by GitHub
parent a1b4def387
commit c8ef60ad9b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 35 additions and 11 deletions

View File

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

View File

@ -1010,6 +1010,7 @@ pthread_condattr_setpshared
pthread_create
pthread_detach
pthread_equal
pthread_getattr_np
pthread_getspecific
pthread_join
pthread_key_create

View 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()
{
ptrdiff_t stack_size;
struct stack_bounds {
void *base;
size_t size;
};
if (&__stack_high)
stack_size = &__stack_high - &__stack_low;
else {
static inline struct stack_bounds get_stack_bounds()
{
struct stack_bounds bounds;
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.

View 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;
}