summaryrefslogtreecommitdiff
path: root/components/libc/compilers
diff options
context:
space:
mode:
Diffstat (limited to 'components/libc/compilers')
-rw-r--r--components/libc/compilers/armlibc/stubs.c17
-rw-r--r--components/libc/compilers/newlib/syscalls.c26
2 files changed, 32 insertions, 11 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();
+
+#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)