diff --git a/components/libc/compilers/armlibc/stubs.c b/components/libc/compilers/armlibc/stubs.c index b4cc13799e8c6b8e07e9dc8abe4198923aa8a0e9..ed328e20e36d17a327e25f6a8e49deb1dae7c180 100644 --- a/components/libc/compilers/armlibc/stubs.c +++ b/components/libc/compilers/armlibc/stubs.c @@ -11,6 +11,7 @@ * in msh. * 2020-08-05 Meco Man fixed _sys_flen() compiling-warning when * RT_USING_DFS is not defined + * 2020-02-13 Meco Man re-implement exit() and abort() */ #include @@ -255,8 +256,23 @@ 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(); + } + + while(1); /* noreturn */ } /** diff --git a/components/libc/compilers/dlib/syscalls.c b/components/libc/compilers/dlib/syscalls.c new file mode 100644 index 0000000000000000000000000000000000000000..0d5f02f9523158e7571ebfe58c59d45d7618d8fc --- /dev/null +++ b/components/libc/compilers/dlib/syscalls.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-02-13 Meco Man implement exit() and abort() + */ +#include + +void exit (int status) +{ + rt_thread_t self = rt_thread_self(); + +#ifdef RT_USING_MODULE + if (dlmodule_self()) + { + dlmodule_exit(status); + } +#endif + + if (self != RT_NULL) + { + rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, status); + rt_thread_suspend(self); + rt_schedule(); + } + + while(1); /* noreturn */ +} + +void abort(void) +{ + 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); /* noreturn */ +} diff --git a/components/libc/compilers/dlib/syscalls.h b/components/libc/compilers/dlib/syscalls.h deleted file mode 100644 index 993962e8dbb924a5e741b33c83a4727df03f2390..0000000000000000000000000000000000000000 --- a/components/libc/compilers/dlib/syscalls.h +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2015-01-28 Bernard first version - */ - diff --git a/components/libc/compilers/newlib/syscalls.c b/components/libc/compilers/newlib/syscalls.c index 193080c92684443df6eb17ce2ee9828cc009b6d2..ae8b51b67238fb5a9e8a243300f33ddefa4cf700 100644 --- a/components/libc/compilers/newlib/syscalls.c +++ b/components/libc/compilers/newlib/syscalls.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2021-02-11 Meco Man remove _gettimeofday_r() and _times_r() + * 2020-02-13 Meco Man re-implement exit() and abort() */ #include @@ -288,6 +289,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 +298,14 @@ exit (int status) } #endif - rt_kprintf("thread:%s exit with %d\n", rt_thread_self()->name, status); - RT_ASSERT(0); + if (self != RT_NULL) + { + rt_kprintf("thread:%-8.*s exit:%d!\n", RT_NAME_MAX, self->name, status); + rt_thread_suspend(self); + rt_schedule(); + } - while (1); + while(1); /* noreturn */ } void @@ -315,17 +322,23 @@ 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); + while(1); /* noreturn */ } uid_t getuid(void)