From b89b3958bc97b2df5eeca301f8a463cccab88fbc Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Sat, 13 Feb 2021 13:16:17 +0800 Subject: [PATCH] =?UTF-8?q?[libc][exit][abort]=20=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0exit=E5=92=8Cabort=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/libc/compilers/armlibc/stubs.c | 17 +++++++++++-- components/libc/compilers/newlib/syscalls.c | 28 +++++++++++++-------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/components/libc/compilers/armlibc/stubs.c b/components/libc/compilers/armlibc/stubs.c index b4cc13799e..600100c554 100644 --- a/components/libc/compilers/armlibc/stubs.c +++ b/components/libc/compilers/armlibc/stubs.c @@ -255,8 +255,21 @@ void _ttywrch(int ch) RT_WEAK void _sys_exit(int return_code) { - /* TODO: perhaps exit the thread which is invoking this function */ - while (1); + rt_thread_t self = rt_thread_self(); + +#ifdef RT_USING_MODULE + if (dlmodule_self()) + { + dlmodule_exit(return_code); + } +#endif + + if (self != RT_NULL) + { + rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, return_code); + rt_thread_suspend(self); + rt_schedule(); + } } /** diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c index 193080c926..5ce2df284d 100644 --- a/components/libc/compilers/newlib/syscalls.c +++ b/components/libc/compilers/newlib/syscalls.c @@ -288,6 +288,8 @@ _free_r (struct _reent *ptr, void *addr) void exit (int status) { + rt_thread_t self = rt_thread_self(); + #ifdef RT_USING_MODULE if (dlmodule_self()) { @@ -295,10 +297,12 @@ exit (int status) } #endif - rt_kprintf("thread:%s exit with %d\n", rt_thread_self()->name, status); - RT_ASSERT(0); - - while (1); + if (self != RT_NULL) + { + rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, status); + rt_thread_suspend(self); + rt_schedule(); + } } void @@ -315,17 +319,21 @@ void __libc_init_array(void) void abort(void) { - if (rt_thread_self()) - { - rt_thread_t self = rt_thread_self(); + rt_thread_t self = rt_thread_self(); +#ifdef RT_USING_MODULE + if (dlmodule_self()) + { + dlmodule_exit(-1); + } +#endif + + if (self != RT_NULL) + { rt_kprintf("thread:%-8.*s abort!\n", RT_NAME_MAX, self->name); rt_thread_suspend(self); - rt_schedule(); } - - while (1); } uid_t getuid(void)