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 \
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() {
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.
#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)
{
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;
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;
}