summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2020-12-31 11:18:06 -0600
committerGitHub <[email protected]>2020-12-31 11:18:06 -0600
commitb315c36a5c401be14b74cfa035186b3e09d31d67 (patch)
treebad49eb730a1e83e31ab8f01c9a7c9338b509f16 /src
parent4a4f00de6bf553a7b047acb2f43b38693c0afaa2 (diff)
parentcbe92500d84c3867dc7eb34cc3dccc74fc91d7b9 (diff)
Merge pull request #9 from RT-Thread/master
pr
Diffstat (limited to 'src')
-rw-r--r--src/device.c33
-rw-r--r--src/idle.c79
-rw-r--r--src/thread.c70
3 files changed, 52 insertions, 130 deletions
diff --git a/src/device.c b/src/device.c
index 32c06b380c..a4f004fb69 100644
--- a/src/device.c
+++ b/src/device.c
@@ -111,38 +111,7 @@ rt_err_t rt_device_init_all(void)
*/
rt_device_t rt_device_find(const char *name)
{
- struct rt_object *object;
- struct rt_list_node *node;
- struct rt_object_information *information;
-
- /* enter critical */
- if (rt_thread_self() != RT_NULL)
- rt_enter_critical();
-
- /* try to find device object */
- information = rt_object_get_information(RT_Object_Class_Device);
- RT_ASSERT(information != RT_NULL);
- for (node = information->object_list.next;
- node != &(information->object_list);
- node = node->next)
- {
- object = rt_list_entry(node, struct rt_object, list);
- if (rt_strncmp(object->name, name, RT_NAME_MAX) == 0)
- {
- /* leave critical */
- if (rt_thread_self() != RT_NULL)
- rt_exit_critical();
-
- return (rt_device_t)object;
- }
- }
-
- /* leave critical */
- if (rt_thread_self() != RT_NULL)
- rt_exit_critical();
-
- /* not found */
- return RT_NULL;
+ return (rt_device_t)rt_object_find(name, RT_Object_Class_Device);
}
RTM_EXPORT(rt_device_find);
diff --git a/src/idle.c b/src/idle.c
index 99db64f571..aa14552a49 100644
--- a/src/idle.c
+++ b/src/idle.c
@@ -150,82 +150,37 @@ void rt_thread_idle_excute(void)
{
/* Loop until there is no dead thread. So one call to rt_thread_idle_excute
* will do all the cleanups. */
- while (_has_defunct_thread())
+ /* disable interrupt */
+
+ RT_DEBUG_NOT_IN_INTERRUPT;
+
+#ifdef RT_USING_HEAP
+ while (1)
{
rt_base_t lock;
rt_thread_t thread;
-#ifdef RT_USING_MODULE
- struct rt_dlmodule *module = RT_NULL;
-#endif
- RT_DEBUG_NOT_IN_INTERRUPT;
- /* disable interrupt */
lock = rt_hw_interrupt_disable();
- /* re-check whether list is empty */
- if (_has_defunct_thread())
- {
- /* get defunct thread */
- thread = rt_list_entry(rt_thread_defunct.next,
- struct rt_thread,
- tlist);
-#ifdef RT_USING_MODULE
- module = (struct rt_dlmodule*)thread->module_id;
- if (module)
- {
- dlmodule_destroy(module);
- }
-#endif
- /* remove defunct thread */
- rt_list_remove(&(thread->tlist));
-
- /* lock scheduler to prevent scheduling in cleanup function. */
- rt_enter_critical();
-
- /* invoke thread cleanup */
- if (thread->cleanup != RT_NULL)
- thread->cleanup(thread);
-
-#ifdef RT_USING_SIGNALS
- rt_thread_free_sig(thread);
-#endif
-
- /* if it's a system object, not delete it */
- if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
- {
- /* detach this object */
- rt_object_detach((rt_object_t)thread);
- /* unlock scheduler */
- rt_exit_critical();
-
- /* enable interrupt */
- rt_hw_interrupt_enable(lock);
-
- return;
- }
-
- /* unlock scheduler */
- rt_exit_critical();
- }
- else
+ /* check whether list is empty */
+ if (!_has_defunct_thread())
{
- /* enable interrupt */
rt_hw_interrupt_enable(lock);
-
- /* may the defunct thread list is removed by others, just return */
- return;
+ break;
}
-
- /* enable interrupt */
- rt_hw_interrupt_enable(lock);
-
-#ifdef RT_USING_HEAP
+ /* get defunct thread */
+ thread = rt_list_entry(rt_thread_defunct.next,
+ struct rt_thread,
+ tlist);
+ /* remove defunct thread */
+ rt_list_remove(&(thread->tlist));
/* release thread's stack */
RT_KERNEL_FREE(thread->stack_addr);
/* delete thread object */
rt_object_delete((rt_object_t)thread);
-#endif
+ rt_hw_interrupt_enable(lock);
}
+#endif
}
extern void rt_system_power_manager(void);
diff --git a/src/thread.c b/src/thread.c
index 49e2022bf7..0db9dd8e4d 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -77,6 +77,31 @@ void rt_thread_inited_sethook(void (*hook)(rt_thread_t thread))
#endif
+/* must be invoke witch rt_hw_interrupt_disable */
+static void _thread_cleanup_execute(rt_thread_t thread)
+{
+ register rt_base_t level;
+#ifdef RT_USING_MODULE
+ struct rt_dlmodule *module = RT_NULL;
+#endif
+ level = rt_hw_interrupt_disable();
+#ifdef RT_USING_MODULE
+ module = (struct rt_dlmodule*)thread->module_id;
+ if (module)
+ {
+ dlmodule_destroy(module);
+ }
+#endif
+ /* invoke thread cleanup */
+ if (thread->cleanup != RT_NULL)
+ thread->cleanup(thread);
+
+#ifdef RT_USING_SIGNALS
+ rt_thread_free_sig(thread);
+#endif
+ rt_hw_interrupt_enable(level);
+}
+
void rt_thread_exit(void)
{
struct rt_thread *thread;
@@ -88,6 +113,8 @@ void rt_thread_exit(void)
/* disable interrupt */
level = rt_hw_interrupt_disable();
+ _thread_cleanup_execute(thread);
+
/* remove from schedule */
rt_schedule_remove_thread(thread);
/* change stat */
@@ -96,8 +123,7 @@ void rt_thread_exit(void)
/* remove it from timer list */
rt_timer_detach(&thread->thread_timer);
- if ((rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) &&
- thread->cleanup == RT_NULL)
+ if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
{
rt_object_detach((rt_object_t)thread);
}
@@ -347,14 +373,15 @@ rt_err_t rt_thread_detach(rt_thread_t thread)
rt_schedule_remove_thread(thread);
}
+ _thread_cleanup_execute(thread);
+
/* release thread timer */
rt_timer_detach(&(thread->thread_timer));
/* change stat */
thread->stat = RT_THREAD_CLOSE;
- if ((rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE) &&
- thread->cleanup == RT_NULL)
+ if (rt_object_is_systemobject((rt_object_t)thread) == RT_TRUE)
{
rt_object_detach((rt_object_t)thread);
}
@@ -449,6 +476,8 @@ rt_err_t rt_thread_delete(rt_thread_t thread)
rt_schedule_remove_thread(thread);
}
+ _thread_cleanup_execute(thread);
+
/* release thread timer */
rt_timer_detach(&(thread->thread_timer));
@@ -862,38 +891,7 @@ RTM_EXPORT(rt_thread_timeout);
*/
rt_thread_t rt_thread_find(char *name)
{
- struct rt_object_information *information;
- struct rt_object *object;
- struct rt_list_node *node;
-
- /* enter critical */
- if (rt_thread_self() != RT_NULL)
- rt_enter_critical();
-
- /* try to find device object */
- information = rt_object_get_information(RT_Object_Class_Thread);
- RT_ASSERT(information != RT_NULL);
- for (node = information->object_list.next;
- node != &(information->object_list);
- node = node->next)
- {
- object = rt_list_entry(node, struct rt_object, list);
- if (rt_strncmp(object->name, name, RT_NAME_MAX) == 0)
- {
- /* leave critical */
- if (rt_thread_self() != RT_NULL)
- rt_exit_critical();
-
- return (rt_thread_t)object;
- }
- }
-
- /* leave critical */
- if (rt_thread_self() != RT_NULL)
- rt_exit_critical();
-
- /* not found */
- return RT_NULL;
+ return (rt_thread_t)rt_object_find(name, RT_Object_Class_Thread);
}
RTM_EXPORT(rt_thread_find);