瀏覽代碼

[libc][exit][abort] 重新实现exit和abort函数

Meco Man 4 年之前
父節點
當前提交
b89b3958bc
共有 2 個文件被更改,包括 32 次插入11 次删除
  1. 15 2
      components/libc/compilers/armlibc/stubs.c
  2. 17 9
      components/libc/compilers/newlib/syscalls.c

+ 15 - 2
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();
+    }
 }
 
 /**

+ 17 - 9
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)