diff --git a/components/libc/compilers/armlibc/stubs.c b/components/libc/compilers/armlibc/stubs.c index b4cc13799e8c6b8e07e9dc8abe4198923aa8a0e9..600100c5541e8b474d5638ee3bb2a59aa82b3109 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 193080c92684443df6eb17ce2ee9828cc009b6d2..5ce2df284ddc59efe102e0908e0708e4d8754eb8 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(); + +#ifdef RT_USING_MODULE + if (dlmodule_self()) { - rt_thread_t self = rt_thread_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)