summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--components/libc/newlib/syscalls.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/components/libc/newlib/syscalls.c b/components/libc/newlib/syscalls.c
index 796c3159b7..7d3797948c 100644
--- a/components/libc/newlib/syscalls.c
+++ b/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;
+}