From e7880a9713ef3efed9ad133231981761bcc3e4eb Mon Sep 17 00:00:00 2001 From: Shell Date: Sat, 23 Dec 2023 17:59:18 +0800 Subject: [PATCH] [kernel] support for hook list Signed-off-by: Shell --- examples/utest/testcases/kernel/Kconfig | 7 +- examples/utest/testcases/kernel/SConscript | 3 + examples/utest/testcases/kernel/hooklist_tc.c | 98 +++++++++++ include/rtdef.h | 165 ++++++++++++++++-- include/rtservice.h | 14 +- include/rtthread.h | 10 +- src/Kconfig | 7 + src/clock.c | 4 - src/ipc.c | 10 -- src/irq.c | 7 - src/kservice.c | 6 +- src/mempool.c | 7 - src/object.c | 16 -- src/scheduler_mp.c | 7 - src/scheduler_up.c | 7 - src/thread.c | 23 +-- src/timer.c | 13 -- 17 files changed, 280 insertions(+), 124 deletions(-) create mode 100644 examples/utest/testcases/kernel/hooklist_tc.c diff --git a/examples/utest/testcases/kernel/Kconfig b/examples/utest/testcases/kernel/Kconfig index b984ca6c37..fc92292f0b 100644 --- a/examples/utest/testcases/kernel/Kconfig +++ b/examples/utest/testcases/kernel/Kconfig @@ -59,5 +59,10 @@ config UTEST_THREAD_TC config UTEST_ATOMIC_TC bool "atomic test" default n - + +config UTEST_HOOKLIST_TC + bool "hook list test" + select RT_USING_HOOKLIST + default n + endmenu diff --git a/examples/utest/testcases/kernel/SConscript b/examples/utest/testcases/kernel/SConscript index 5d560e076b..ea2780e4d7 100644 --- a/examples/utest/testcases/kernel/SConscript +++ b/examples/utest/testcases/kernel/SConscript @@ -44,6 +44,9 @@ if GetDepend(['UTEST_THREAD_TC']): if GetDepend(['UTEST_ATOMIC_TC']): src += ['atomic_tc.c'] +if GetDepend(['UTEST_HOOKLIST_TC']): + src += ['hooklist_tc.c'] + group = DefineGroup('utestcases', src, depend = ['RT_USING_UTESTCASES'], CPPPATH = CPPPATH) Return('group') diff --git a/examples/utest/testcases/kernel/hooklist_tc.c b/examples/utest/testcases/kernel/hooklist_tc.c new file mode 100644 index 0000000000..a513517782 --- /dev/null +++ b/examples/utest/testcases/kernel/hooklist_tc.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2006-2023, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-12-22 Shell Support hook list + */ + +#include +#include "rtconfig.h" +#include "utest.h" +#include "utest_assert.h" + +static int hooker1_ent_count; +static int hooker2_ent_count; +static struct rt_thread thr_tobe_inited; + +static void thread_inited_hooker1(rt_thread_t thread) +{ + LOG_D("%s: count %d", __func__, hooker1_ent_count); + hooker1_ent_count += 1; +} +RT_OBJECT_HOOKLIST_DEFINE_NODE(rt_thread_inited, hooker1_node, thread_inited_hooker1); + +static void thread_inited_hooker2(rt_thread_t thread) +{ + LOG_D("%s: count %d", __func__, hooker2_ent_count); + hooker2_ent_count += 1; +} +RT_OBJECT_HOOKLIST_DEFINE_NODE(rt_thread_inited, hooker2_node, thread_inited_hooker2); + +static char _thr_stack[UTEST_THR_STACK_SIZE]; +static void thr_tobe_inited_entry(void *param) +{ + rt_kprintf("Hello!\n"); +} + +static void hooklist_test(void) +{ + hooker1_ent_count = 0; + hooker2_ent_count = 0; + rt_thread_inited_sethook(&hooker1_node); + rt_thread_inited_sethook(&hooker2_node); + + /* run 1 */ + rt_thread_init(&thr_tobe_inited, + "thr_tobe_inited", + thr_tobe_inited_entry, + NULL, + _thr_stack, + sizeof(_thr_stack), + 25, + 100); + + uassert_int_equal(hooker1_ent_count, 1); + uassert_int_equal(hooker2_ent_count, 1); + + rt_thread_detach(&thr_tobe_inited); + rt_thread_mdelay(1); /* wait recycling done */ + + /* run 2 */ + rt_thread_inited_rmhook(&hooker2_node); + + rt_thread_init(&thr_tobe_inited, + "thr_tobe_inited", + thr_tobe_inited_entry, + NULL, + _thr_stack, + sizeof(_thr_stack), + 25, + 100); + + uassert_int_equal(hooker1_ent_count, 2); + uassert_int_equal(hooker2_ent_count, 1); +} + +static rt_err_t utest_tc_init(void) +{ + hooker1_ent_count = 0; + hooker2_ent_count = 0; + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_thread_detach(&thr_tobe_inited); + rt_thread_inited_rmhook(&hooker1_node); + rt_thread_inited_rmhook(&hooker2_node); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(hooklist_test); +} +UTEST_TC_EXPORT(testcase, "testcases.kernel.hooklist_tc", utest_tc_init, utest_tc_cleanup, 10); diff --git a/include/rtdef.h b/include/rtdef.h index 26b344073a..a13d8b782b 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -54,6 +54,7 @@ * 2023-10-11 zmshahaha move specific devices related and driver to components/drivers * 2023-11-21 Meco Man add RT_USING_NANO macro * 2023-12-18 xqyjlj add rt_always_inline + * 2023-12-22 Shell Support hook list */ #ifndef __RT_DEF_H__ @@ -198,6 +199,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define rt_used __attribute__((used)) #define rt_align(n) __attribute__((aligned(n))) #define rt_weak __attribute__((weak)) +#define rt_typeof typeof #define rt_noreturn #define rt_inline static __inline #define rt_always_inline rt_inline @@ -207,6 +209,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define PRAGMA(x) _Pragma(#x) #define rt_align(n) PRAGMA(data_alignment=n) #define rt_weak __weak +#define rt_typeof typeof #define rt_noreturn #define rt_inline static inline #define rt_always_inline rt_inline @@ -217,6 +220,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define rt_used __attribute__((used)) #define rt_align(n) __attribute__((aligned(n))) #define rt_weak __attribute__((weak)) +#define rt_typeof __typeof__ #define rt_noreturn __attribute__ ((noreturn)) #define rt_inline static __inline #define rt_always_inline static inline __attribute__((always_inline)) @@ -225,6 +229,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define rt_used __attribute__((used)) #define rt_align(n) __attribute__((aligned(n))) #define rt_weak __attribute__((weak)) +#define rt_typeof typeof #define rt_noreturn #define rt_inline static inline #define rt_always_inline rt_inline @@ -233,6 +238,7 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define rt_used #define rt_align(n) __declspec(align(n)) #define rt_weak +#define rt_typeof typeof #define rt_noreturn #define rt_inline static __inline #define rt_always_inline rt_inline @@ -253,6 +259,8 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #else #define rt_weak #endif +#define rt_typeof typeof +#define rt_noreturn #define rt_inline static inline #define rt_always_inline rt_inline #elif defined (__TASKING__) @@ -261,6 +269,8 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ #define PRAGMA(x) _Pragma(#x) #define rt_align(n) __attribute__((__align(n))) #define rt_weak __attribute__((weak)) +#define rt_typeof typeof +#define rt_noreturn #define rt_inline static inline #define rt_always_inline rt_inline #else @@ -593,10 +603,24 @@ struct rt_object_information * The hook function call macro */ #ifndef RT_USING_HOOK - #define __ON_HOOK_ARGS(__hook, argv) - #define RT_OBJECT_HOOK_CALL(func, argv) +#define RT_OBJECT_HOOK_CALL(func, argv) + #else - #define RT_OBJECT_HOOK_CALL(func, argv) __on_##func argv + +/** + * @brief Add hook point in the routines + * @note Usage: + * void foo() { + * do_something(); + * + * RT_OBJECT_HOOK_CALL(foo); + * + * do_other_things(); + * } + */ +#define _RT_OBJECT_HOOK_CALL(func, argv) __ON_HOOK_ARGS(func, argv) +#define RT_OBJECT_HOOK_CALL(func, argv) _RT_OBJECT_HOOK_CALL(func, argv) + #ifdef RT_HOOK_USING_FUNC_PTR #define __ON_HOOK_ARGS(__hook, argv) do {if ((__hook) != RT_NULL) __hook argv; } while (0) #else @@ -604,22 +628,127 @@ struct rt_object_information #endif /* RT_HOOK_USING_FUNC_PTR */ #endif /* RT_USING_HOOK */ -#ifndef __on_rt_interrupt_switch_hook - #define __on_rt_interrupt_switch_hook() __ON_HOOK_ARGS(rt_interrupt_switch_hook, ()) -#endif -#ifndef __on_rt_malloc_hook - #define __on_rt_malloc_hook(addr, size) __ON_HOOK_ARGS(rt_malloc_hook, (addr, size)) -#endif -#ifndef __on_rt_realloc_entry_hook - #define __on_rt_realloc_entry_hook(addr, size) __ON_HOOK_ARGS(rt_realloc_entry_hook, (addr, size)) -#endif -#ifndef __on_rt_realloc_exit_hook - #define __on_rt_realloc_exit_hook(addr, size) __ON_HOOK_ARGS(rt_realloc_exit_hook, (addr, size)) -#endif -#ifndef __on_rt_free_hook - #define __on_rt_free_hook(rmem) __ON_HOOK_ARGS(rt_free_hook, (rmem)) -#endif +#ifdef RT_USING_HOOKLIST +/** + * @brief Add declaration for hook list types. + * + * @note Usage: + * This is typically used in your header. In foo.h using this like: + * + * ```foo.h + * typedef void (*bar_hook_proto_t)(arguments...); + * RT_OBJECT_HOOKLIST_DECLARE(bar_hook_proto_t, bar_myhook); + * ``` + */ +#define RT_OBJECT_HOOKLIST_DECLARE(handler_type, name) \ + typedef struct name##_hooklistnode \ + { \ + handler_type handler; \ + rt_list_t list_node; \ + } *name##_hooklistnode_t; \ + extern volatile rt_ubase_t name##_nested; \ + void name##_sethook(name##_hooklistnode_t node); \ + void name##_rmhook(name##_hooklistnode_t node) + +/** + * @brief Add declaration for hook list node. + * + * @note Usage + * You can add a hook like this. + * + * ```addhook.c + * void myhook(arguments...) { do_something(); } + * RT_OBJECT_HOOKLIST_DEFINE_NODE(bar_myhook, myhook_node, myhook); + * + * void addhook(void) + * { + * bar_myhook_sethook(myhook); + * } + * ``` + * + * BTW, you can also find examples codes under + * `examples/utest/testcases/kernel/hooklist_tc.c`. + */ +#define RT_OBJECT_HOOKLIST_DEFINE_NODE(hookname, nodename, hooker_handler) \ + struct hookname##_hooklistnode nodename = { \ + .handler = hooker_handler, \ + .list_node = RT_LIST_OBJECT_INIT(nodename.list_node), \ + }; + +/** + * @note Usage + * Add this macro to the source file where your hook point is inserted. + */ +#define RT_OBJECT_HOOKLIST_DEFINE(name) \ + static rt_list_t name##_hooklist = RT_LIST_OBJECT_INIT(name##_hooklist); \ + static struct rt_spinlock name##lock = RT_SPINLOCK_INIT; \ + volatile rt_ubase_t name##_nested = 0; \ + void name##_sethook(name##_hooklistnode_t node) \ + { \ + rt_ubase_t level = rt_spin_lock_irqsave(&name##lock); \ + while (name##_nested) \ + { \ + rt_spin_unlock_irqrestore(&name##lock, level); \ + level = rt_spin_lock_irqsave(&name##lock); \ + } \ + rt_list_insert_before(&name##_hooklist, &node->list_node); \ + rt_spin_unlock_irqrestore(&name##lock, level); \ + } \ + void name##_rmhook(name##_hooklistnode_t node) \ + { \ + rt_ubase_t level = rt_spin_lock_irqsave(&name##lock); \ + while (name##_nested) \ + { \ + rt_spin_unlock_irqrestore(&name##lock, level); \ + level = rt_spin_lock_irqsave(&name##lock); \ + } \ + rt_list_remove(&node->list_node); \ + rt_spin_unlock_irqrestore(&name##lock, level); \ + } + +/** + * @brief Add hook list point in the routines. Multiple hookers in the list will + * be called one by one starting from head node. + * + * @note Usage: + * void foo() { + * do_something(); + * + * RT_OBJECT_HOOKLIST_CALL(foo); + * + * do_other_things(); + * } + */ +#define _RT_OBJECT_HOOKLIST_CALL(nodetype, nested, list, lock, argv) \ + do \ + { \ + nodetype iter; \ + rt_ubase_t level = rt_spin_lock_irqsave(&lock); \ + nested += 1; \ + rt_spin_unlock_irqrestore(&lock, level); \ + if (!rt_list_isempty(&list)) \ + { \ + rt_list_for_each_entry(iter, &list, list_node) \ + { \ + iter->handler argv; \ + } \ + } \ + level = rt_spin_lock_irqsave(&lock); \ + nested -= 1; \ + rt_spin_unlock_irqrestore(&lock, level); \ + } while (0) +#define RT_OBJECT_HOOKLIST_CALL(name, argv) \ + _RT_OBJECT_HOOKLIST_CALL(name##_hooklistnode_t, name##_nested, \ + name##_hooklist, name##lock, argv) + +#else + +#define RT_OBJECT_HOOKLIST_DECLARE(handler_type, name) +#define RT_OBJECT_HOOKLIST_DEFINE_NODE(hookname, nodename, hooker_handler) +#define RT_OBJECT_HOOKLIST_DEFINE(name) +#define RT_OBJECT_HOOKLIST_CALL(name, argv) +#endif /* RT_USING_HOOKLIST */ /**@}*/ diff --git a/include/rtservice.h b/include/rtservice.h index 03301aa99a..83faf640f7 100644 --- a/include/rtservice.h +++ b/include/rtservice.h @@ -151,9 +151,9 @@ rt_inline unsigned int rt_list_len(const rt_list_t *l) * @param member the name of the list_struct within the struct. */ #define rt_list_for_each_entry(pos, head, member) \ - for (pos = rt_list_entry((head)->next, typeof(*pos), member); \ + for (pos = rt_list_entry((head)->next, rt_typeof(*pos), member); \ &pos->member != (head); \ - pos = rt_list_entry(pos->member.next, typeof(*pos), member)) + pos = rt_list_entry(pos->member.next, rt_typeof(*pos), member)) /** * rt_list_for_each_entry_safe - iterate over list of given type safe against removal of list entry @@ -163,10 +163,10 @@ rt_inline unsigned int rt_list_len(const rt_list_t *l) * @param member the name of the list_struct within the struct. */ #define rt_list_for_each_entry_safe(pos, n, head, member) \ - for (pos = rt_list_entry((head)->next, typeof(*pos), member), \ - n = rt_list_entry(pos->member.next, typeof(*pos), member); \ + for (pos = rt_list_entry((head)->next, rt_typeof(*pos), member), \ + n = rt_list_entry(pos->member.next, rt_typeof(*pos), member); \ &pos->member != (head); \ - pos = n, n = rt_list_entry(n->member.next, typeof(*n), member)) + pos = n, n = rt_list_entry(n->member.next, rt_typeof(*n), member)) /** * rt_list_first_entry - get the first element from a list @@ -280,9 +280,9 @@ rt_inline int rt_slist_isempty(rt_slist_t *l) * @param member the name of the list_struct within the struct. */ #define rt_slist_for_each_entry(pos, head, member) \ - for (pos = ((head)->next == (RT_NULL) ? (RT_NULL) : rt_slist_entry((head)->next, typeof(*pos), member)); \ + for (pos = ((head)->next == (RT_NULL) ? (RT_NULL) : rt_slist_entry((head)->next, rt_typeof(*pos), member)); \ pos != (RT_NULL) && &pos->member != (RT_NULL); \ - pos = (pos->member.next == (RT_NULL) ? (RT_NULL) : rt_slist_entry(pos->member.next, typeof(*pos), member))) + pos = (pos->member.next == (RT_NULL) ? (RT_NULL) : rt_slist_entry(pos->member.next, rt_typeof(*pos), member))) /** * rt_slist_first_entry - get the first element from a slist diff --git a/include/rtthread.h b/include/rtthread.h index fc14e50de1..93fd138334 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -179,7 +179,15 @@ int rt_thread_kill(rt_thread_t tid, int sig); #ifdef RT_USING_HOOK void rt_thread_suspend_sethook(void (*hook)(rt_thread_t thread)); void rt_thread_resume_sethook (void (*hook)(rt_thread_t thread)); -void rt_thread_inited_sethook (void (*hook)(rt_thread_t thread)); + +/** + * @brief Sets a hook function when a thread is initialized. + * + * @param thread is the target thread that initializing + */ +typedef void (*rt_thread_inited_hookproto_t)(rt_thread_t thread); +RT_OBJECT_HOOKLIST_DECLARE(rt_thread_inited_hookproto_t, rt_thread_inited); + #endif /* RT_USING_HOOK */ /* diff --git a/src/Kconfig b/src/Kconfig index 2d1387b14d..75e19744e2 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -132,6 +132,13 @@ config RT_USING_HOOK default y endif +config RT_USING_HOOKLIST + bool "Enable hook list" + default n + help + Enable the hook list feature for rt-thread packages. With this, they can + plug in to the system on run-time. + config RT_USING_IDLE_HOOK bool "Enable IDLE Task hook" default y if RT_USING_HOOK diff --git a/src/clock.c b/src/clock.c index a029e19110..9dd447f3f2 100644 --- a/src/clock.c +++ b/src/clock.c @@ -29,10 +29,6 @@ static volatile rt_atomic_t rt_tick = 0; #endif /* RT_USING_SMP */ -#ifndef __on_rt_tick_hook - #define __on_rt_tick_hook() __ON_HOOK_ARGS(rt_tick_hook, ()) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_tick_hook)(void); diff --git a/src/ipc.c b/src/ipc.c index be537f60af..730f41d175 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -55,16 +55,6 @@ #define DBG_LVL DBG_INFO #include -#ifndef __on_rt_object_trytake_hook - #define __on_rt_object_trytake_hook(parent) __ON_HOOK_ARGS(rt_object_trytake_hook, (parent)) -#endif -#ifndef __on_rt_object_take_hook - #define __on_rt_object_take_hook(parent) __ON_HOOK_ARGS(rt_object_take_hook, (parent)) -#endif -#ifndef __on_rt_object_put_hook - #define __on_rt_object_put_hook(parent) __ON_HOOK_ARGS(rt_object_put_hook, (parent)) -#endif - #define GET_MESSAGEBYTE_ADDR(msg) ((struct rt_mq_message *) msg + 1) #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) extern void (*rt_object_trytake_hook)(struct rt_object *object); diff --git a/src/irq.c b/src/irq.c index 45a7cf4b66..03287200cf 100644 --- a/src/irq.c +++ b/src/irq.c @@ -22,13 +22,6 @@ #define DBG_LVL DBG_INFO #include -#ifndef __on_rt_interrupt_enter_hook - #define __on_rt_interrupt_enter_hook() __ON_HOOK_ARGS(rt_interrupt_enter_hook, ()) -#endif -#ifndef __on_rt_interrupt_leave_hook - #define __on_rt_interrupt_leave_hook() __ON_HOOK_ARGS(rt_interrupt_leave_hook, ()) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_interrupt_enter_hook)(void); diff --git a/src/kservice.c b/src/kservice.c index c6e39730ef..3a42b65410 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -1579,7 +1579,7 @@ rt_err_t rt_backtrace_frame(struct rt_hw_backtrace_frame *frame) { long nesting = 0; - rt_kprintf("please use: addr2line -e rtthread.elf -a -f\n"); + rt_kprintf("please use: addr2line -e rtthread.elf -a -f"); while (nesting < RT_BACKTRACE_LEVEL_MAX_NR) { @@ -2177,10 +2177,6 @@ int __rt_ffs(int value) #endif /* RT_USING_TINY_FFS */ #endif /* RT_USING_CPU_FFS */ -#ifndef __on_rt_assert_hook - #define __on_rt_assert_hook(ex, func, line) __ON_HOOK_ARGS(rt_assert_hook, (ex, func, line)) -#endif - #ifdef RT_USING_DEBUG /* RT_ASSERT(EX)'s hook */ diff --git a/src/mempool.c b/src/mempool.c index 4fdba42715..accc18e6d4 100644 --- a/src/mempool.c +++ b/src/mempool.c @@ -24,13 +24,6 @@ #ifdef RT_USING_MEMPOOL -#ifndef __on_rt_mp_alloc_hook - #define __on_rt_mp_alloc_hook(mp, block) __ON_HOOK_ARGS(rt_mp_alloc_hook, (mp, block)) -#endif -#ifndef __on_rt_mp_free_hook - #define __on_rt_mp_free_hook(mp, block) __ON_HOOK_ARGS(rt_mp_free_hook, (mp, block)) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_mp_alloc_hook)(struct rt_mempool *mp, void *block); static void (*rt_mp_free_hook)(struct rt_mempool *mp, void *block); diff --git a/src/object.c b/src/object.c index 791e183d5c..2d9f5c2f51 100644 --- a/src/object.c +++ b/src/object.c @@ -137,22 +137,6 @@ static struct rt_object_information _object_container[RT_Object_Info_Unknown] = #endif }; -#ifndef __on_rt_object_attach_hook - #define __on_rt_object_attach_hook(obj) __ON_HOOK_ARGS(rt_object_attach_hook, (obj)) -#endif -#ifndef __on_rt_object_detach_hook - #define __on_rt_object_detach_hook(obj) __ON_HOOK_ARGS(rt_object_detach_hook, (obj)) -#endif -#ifndef __on_rt_object_trytake_hook - #define __on_rt_object_trytake_hook(parent) __ON_HOOK_ARGS(rt_object_trytake_hook, (parent)) -#endif -#ifndef __on_rt_object_take_hook - #define __on_rt_object_take_hook(parent) __ON_HOOK_ARGS(rt_object_take_hook, (parent)) -#endif -#ifndef __on_rt_object_put_hook - #define __on_rt_object_put_hook(parent) __ON_HOOK_ARGS(rt_object_put_hook, (parent)) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_object_attach_hook)(struct rt_object *object); static void (*rt_object_detach_hook)(struct rt_object *object); diff --git a/src/scheduler_mp.c b/src/scheduler_mp.c index 9b72011963..06193c388e 100644 --- a/src/scheduler_mp.c +++ b/src/scheduler_mp.c @@ -48,13 +48,6 @@ rt_uint32_t rt_thread_ready_priority_group; rt_uint8_t rt_thread_ready_table[32]; #endif /* RT_THREAD_PRIORITY_MAX > 32 */ -#ifndef __on_rt_scheduler_hook - #define __on_rt_scheduler_hook(from, to) __ON_HOOK_ARGS(rt_scheduler_hook, (from, to)) -#endif -#ifndef __on_rt_scheduler_switch_hook - #define __on_rt_scheduler_switch_hook(tid) __ON_HOOK_ARGS(rt_scheduler_switch_hook, (tid)) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_scheduler_hook)(struct rt_thread *from, struct rt_thread *to); static void (*rt_scheduler_switch_hook)(struct rt_thread *tid); diff --git a/src/scheduler_up.c b/src/scheduler_up.c index 34193b0acc..635b55f7d9 100644 --- a/src/scheduler_up.c +++ b/src/scheduler_up.c @@ -51,13 +51,6 @@ static rt_int16_t rt_scheduler_lock_nest; struct rt_thread *rt_current_thread = RT_NULL; rt_uint8_t rt_current_priority; -#ifndef __on_rt_scheduler_hook - #define __on_rt_scheduler_hook(from, to) __ON_HOOK_ARGS(rt_scheduler_hook, (from, to)) -#endif -#ifndef __on_rt_scheduler_switch_hook - #define __on_rt_scheduler_switch_hook(tid) __ON_HOOK_ARGS(rt_scheduler_switch_hook, (tid)) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_scheduler_hook)(struct rt_thread *from, struct rt_thread *to); static void (*rt_scheduler_switch_hook)(struct rt_thread *tid); diff --git a/src/thread.c b/src/thread.c index 9f2a89ee4f..9f1a9f3cfb 100644 --- a/src/thread.c +++ b/src/thread.c @@ -45,20 +45,9 @@ #define DBG_LVL DBG_INFO #include -#ifndef __on_rt_thread_inited_hook - #define __on_rt_thread_inited_hook(thread) __ON_HOOK_ARGS(rt_thread_inited_hook, (thread)) -#endif -#ifndef __on_rt_thread_suspend_hook - #define __on_rt_thread_suspend_hook(thread) __ON_HOOK_ARGS(rt_thread_suspend_hook, (thread)) -#endif -#ifndef __on_rt_thread_resume_hook - #define __on_rt_thread_resume_hook(thread) __ON_HOOK_ARGS(rt_thread_resume_hook, (thread)) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) static void (*rt_thread_suspend_hook)(rt_thread_t thread); static void (*rt_thread_resume_hook) (rt_thread_t thread); -static void (*rt_thread_inited_hook) (rt_thread_t thread); /** * @brief This function sets a hook function when the system suspend a thread. @@ -84,15 +73,7 @@ void rt_thread_resume_sethook(void (*hook)(rt_thread_t thread)) rt_thread_resume_hook = hook; } -/** - * @brief This function sets a hook function when a thread is initialized. - * - * @param hook is the specified hook function. - */ -void rt_thread_inited_sethook(void (*hook)(rt_thread_t thread)) -{ - rt_thread_inited_hook = hook; -} +RT_OBJECT_HOOKLIST_DEFINE(rt_thread_inited); #endif /* defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) */ static void _thread_exit(void) @@ -313,7 +294,7 @@ static rt_err_t _thread_init(struct rt_thread *thread, rt_atomic_store(&thread->ref_count, 0); rt_spin_lock_init(&thread->spinlock); - RT_OBJECT_HOOK_CALL(rt_thread_inited_hook, (thread)); + RT_OBJECT_HOOKLIST_CALL(rt_thread_inited, (thread)); return RT_EOK; } diff --git a/src/timer.c b/src/timer.c index 82eee31e7b..2f1ad9c718 100644 --- a/src/timer.c +++ b/src/timer.c @@ -57,19 +57,6 @@ rt_align(RT_ALIGN_SIZE) static rt_uint8_t _timer_thread_stack[RT_TIMER_THREAD_STACK_SIZE]; #endif /* RT_USING_TIMER_SOFT */ -#ifndef __on_rt_object_take_hook - #define __on_rt_object_take_hook(parent) __ON_HOOK_ARGS(rt_object_take_hook, (parent)) -#endif -#ifndef __on_rt_object_put_hook - #define __on_rt_object_put_hook(parent) __ON_HOOK_ARGS(rt_object_put_hook, (parent)) -#endif -#ifndef __on_rt_timer_enter_hook - #define __on_rt_timer_enter_hook(t) __ON_HOOK_ARGS(rt_timer_enter_hook, (t)) -#endif -#ifndef __on_rt_timer_exit_hook - #define __on_rt_timer_exit_hook(t) __ON_HOOK_ARGS(rt_timer_exit_hook, (t)) -#endif - #if defined(RT_USING_HOOK) && defined(RT_HOOK_USING_FUNC_PTR) extern void (*rt_object_take_hook)(struct rt_object *object); extern void (*rt_object_put_hook)(struct rt_object *object);