浏览代码

Add exit function when exit from a module.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2437 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 12 年之前
父节点
当前提交
6698e69fc8
共有 1 个文件被更改,包括 43 次插入0 次删除
  1. 43 0
      components/libc/newlib/syscalls.c

+ 43 - 0
components/libc/newlib/syscalls.c

@@ -386,8 +386,51 @@ _free_r (struct _reent *ptr, void *addr)
 void
 _exit (int status)
 {
+#ifdef RT_USING_MODULE
+	rt_module_t module;
+
+	module = rt_module_self();
+	if (module != RT_NULL)
+	{
+		struct rt_list_node *list;
+		struct rt_object *object;
+
+		rt_enter_critical();
+		
+        /* delete all threads in the module */
+        list = &module->module_object[RT_Object_Class_Thread].object_list;
+        while (list->next != list)
+        {
+            object = rt_list_entry(list->next, struct rt_object, list);
+            if (rt_object_is_systemobject(object) == RT_TRUE)
+            {
+                /* detach static object */
+                rt_thread_detach((rt_thread_t)object);
+            }
+            else
+            {
+                /* delete dynamic object */
+                rt_thread_delete((rt_thread_t)object);
+            }
+        }
+		/* delete main thread */
+		rt_thread_delete(module->module_thread);
+		rt_exit_critical();
+
+		/* re-schedule */
+		rt_schedule();
+	}
+#endif
+	
 	rt_kprintf("thread:%s exit with %d\n", rt_thread_self()->name, status);
 	RT_ASSERT(0);
 
 	while (1);
 }
+
+void 
+_system(const char *s)
+{
+    /* not support this call */
+    return;
+}