| 57 | static struct rt_spinlock _hook_spinlock; |
| 58 | |
| 59 | rt_err_t rt_thread_idle_sethook(void (*hook)(void)) |
| 60 | { |
| 61 | rt_size_t i; |
| 62 | rt_err_t ret = -RT_EFULL; |
| 63 | rt_base_t level; |
| 64 | |
| 65 | level = rt_spin_lock_irqsave(&_hook_spinlock); |
| 66 | |
| 67 | for (i = 0; i < RT_IDLE_HOOK_LIST_SIZE; i++) |
| 68 | { |
| 69 | if (idle_hook_list[i] == RT_NULL) |
| 70 | { |
| 71 | idle_hook_list[i] = hook; |
| 72 | ret = RT_EOK; |
| 73 | break; |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | rt_spin_unlock_irqrestore(&_hook_spinlock, level); |
| 78 | |
| 79 | return ret; |
| 80 | } |
| 81 | |
| 82 | /** |
| 83 | * @addtogroup group_thread_management |