]> git.proxmox.com Git - wasi-libc.git/commitdiff
Disable pthread_exit for now (#366)
authorYAMAMOTO Takashi <yamamoto@midokura.com>
Wed, 21 Dec 2022 01:24:09 +0000 (10:24 +0900)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Wed, 2 Aug 2023 10:24:08 +0000 (12:24 +0200)
The current wasi-threads has no thread-exit functionality.
Thus it isn't straightforward to implement pthread_exit
without leaking thread context. This commit simply disables
pthread_exit for now.

Also, instead of abusing `wasi_proc_exit` for thread exit,
make `wasi_thread_start` return.

Note: `wasi_proc_exit` is supposed to terminate all threads
in the "process", not only the calling thread.

Note: Depending on the conclusion of the discussion about
`wasi_thread_exit`, we might revisit this change later.

References:
https://github.com/WebAssembly/wasi-threads/issues/7
https://github.com/WebAssembly/wasi-threads/pull/17

expected/wasm32-wasi-pthread/defined-symbols.txt
libc-top-half/musl/include/pthread.h
libc-top-half/musl/src/include/pthread.h
libc-top-half/musl/src/thread/pthread_create.c

index 6bd0fae4ec0d39758217b474390dd86fec3a95a3..c69ffe27c5b391609ffd083fb092121af7cd2f92 100644 (file)
@@ -193,7 +193,6 @@ __progname
 __progname_full
 __pthread_cond_timedwait
 __pthread_create
-__pthread_exit
 __pthread_join
 __pthread_key_create
 __pthread_key_delete
@@ -1002,7 +1001,6 @@ pthread_condattr_setclock
 pthread_condattr_setpshared
 pthread_create
 pthread_detach
-pthread_exit
 pthread_getspecific
 pthread_join
 pthread_key_create
index 01fe5f29307ab0e9d2688e9317b0f5f6af15a5a6..b14fe826d74b3101a4fd4ab901ce9839c63cab75 100644 (file)
@@ -85,7 +85,9 @@ extern "C" {
 
 int pthread_create(pthread_t *__restrict, const pthread_attr_t *__restrict, void *(*)(void *), void *__restrict);
 int pthread_detach(pthread_t);
+#ifdef __wasilibc_unmodified_upstream
 _Noreturn void pthread_exit(void *);
+#endif
 int pthread_join(pthread_t, void **);
 
 #ifdef __GNUC__
index 7167d3e11a11eff076d6fa8066f03df64c616ffc..0aba813e9a47911b96cfbefb35f1660702e70818 100644 (file)
@@ -7,7 +7,9 @@ hidden int __pthread_once(pthread_once_t *, void (*)(void));
 hidden void __pthread_testcancel(void);
 hidden int __pthread_setcancelstate(int, int *);
 hidden int __pthread_create(pthread_t *restrict, const pthread_attr_t *restrict, void *(*)(void *), void *restrict);
+#ifdef __wasilibc_unmodified_upstream
 hidden _Noreturn void __pthread_exit(void *);
+#endif
 hidden int __pthread_join(pthread_t, void **);
 hidden int __pthread_mutex_lock(pthread_mutex_t *);
 hidden int __pthread_mutex_trylock(pthread_mutex_t *);
index 1ac920f13c8ddc998551eeb7daf4e36b005269be..12fccc7a7e223ffa0b5620e518223ab906ec381c 100644 (file)
@@ -60,7 +60,11 @@ void __tl_sync(pthread_t td)
        if (tl_lock_waiters) __wake(&__thread_list_lock, 1, 0);
 }
 
+#ifdef __wasilibc_unmodified_upstream
 _Noreturn void __pthread_exit(void *result)
+#else
+static void __pthread_exit(void *result)
+#endif
 {
        pthread_t self = __pthread_self();
        sigset_t set;
@@ -191,7 +195,7 @@ _Noreturn void __pthread_exit(void *result)
                __tl_unlock();
                free(self->map_base);
                // Can't use `exit()` here, because it is too high level
-               for (;;) __wasi_proc_exit(0);
+               return;
        }
 #endif
 
@@ -212,7 +216,6 @@ _Noreturn void __pthread_exit(void *result)
        // do it manually here
        __tl_unlock();
        // Can't use `exit()` here, because it is too high level
-       for (;;) __wasi_proc_exit(0);
 #endif
 }
 
@@ -272,7 +275,7 @@ static int start_c11(void *p)
 }
 #else
 __attribute__((export_name("wasi_thread_start")))
-_Noreturn void wasi_thread_start(int tid, void *p)
+void wasi_thread_start(int tid, void *p)
 {
        struct start_args *args = p;
        __asm__(".globaltype __tls_base, i32\n"
@@ -570,5 +573,7 @@ fail:
        return EAGAIN;
 }
 
+#ifdef __wasilibc_unmodified_upstream
 weak_alias(__pthread_exit, pthread_exit);
+#endif
 weak_alias(__pthread_create, pthread_create);