diff --git a/options/posix/generic/pthread-stubs.cpp b/options/posix/generic/pthread-stubs.cpp index 7c60cc2900..cc3a49294d 100644 --- a/options/posix/generic/pthread-stubs.cpp +++ b/options/posix/generic/pthread-stubs.cpp @@ -354,11 +354,18 @@ namespace { FutexLock key_mutex_; } -int pthread_exit(void *ret_val) { +namespace mlibc { + [[noreturn]] void do_exit() { + sys_thread_exit(); + __builtin_unreachable(); + } +} + +[[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 + mlibc::do_exit(); __atomic_fetch_or(&self->cancelBits, tcbExitingBit, __ATOMIC_RELAXED); @@ -392,8 +399,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 - mlibc::sys_thread_exit(); - __builtin_unreachable(); + mlibc::do_exit(); } int pthread_join(pthread_t thread, void **ret) { 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);