diff --git a/options/posix/generic/pthread-stubs.cpp b/options/posix/generic/pthread-stubs.cpp index 7c60cc2900..66af54ee59 100644 --- a/options/posix/generic/pthread-stubs.cpp +++ b/options/posix/generic/pthread-stubs.cpp @@ -354,11 +354,11 @@ namespace { FutexLock key_mutex_; } -int pthread_exit(void *ret_val) { +[[noreturn]] void pthread_exit(void *ret_val) { auto self = mlibc::get_current_tcb(); if (__atomic_load_n(&self->cancelBits, __ATOMIC_RELAXED) & tcbExitingBit) - return 0; // We are already exiting + goto exit; __atomic_fetch_or(&self->cancelBits, tcbExitingBit, __ATOMIC_RELAXED); @@ -392,6 +392,7 @@ int pthread_exit(void *ret_val) { // TODO: clean up thread resources when we are detached. // TODO: do exit(0) when we're the only thread instead +exit: mlibc::sys_thread_exit(); __builtin_unreachable(); } diff --git a/options/posix/include/pthread.h b/options/posix/include/pthread.h index 87deb2966b..701e2fd8dc 100644 --- a/options/posix/include/pthread.h +++ b/options/posix/include/pthread.h @@ -179,7 +179,7 @@ int pthread_create(pthread_t *__restrict, const pthread_attr_t *__restrict, void *(*) (void *), void *__restrict); pthread_t pthread_self(void); int pthread_equal(pthread_t, pthread_t); -int pthread_exit(void *); +[[noreturn]] void pthread_exit(void *); int pthread_join(pthread_t, void **); int pthread_detach(pthread_t);