1 #pragma once
2 
3 #include <common/err.h>
4 #include <common/numa.h>
5 #include <process/proc-types.h>
6 #include <process/process.h>
7 
8 /**
9  * @brief kthread信息
10  * 该结构体将会绑定到pcb的worker_private中
11  */
12 struct kthread_info_t
13 {
14     uint64_t flags;
15     uint32_t cpu;
16     int result;
17     int (*thread_fn)(void *);
18     void *data;
19     // todo: 将这里改为completion机制
20     bool exited;     // 是否已退出
21     char *full_name; // 内核线程的名称
22 };
23 
24 struct process_control_block *kthread_create_on_node(int (*thread_fn)(void *data), void *data, int node,
25                                                      const char name_fmt[], ...);
26 /**
27  * @brief 在当前结点上创建一个内核线程
28  *
29  * @param thread_fn 该内核线程要执行的函数
30  * @param data 传递给 thread_fn 的参数数据
31  * @param name_fmt printf-style format string for the thread name
32  * @param arg name_fmt的参数
33  *
34  * 请注意,该宏会创建一个内核线程,并将其设置为停止状态
35  */
36 #define kthread_create(thread_fn, data, name_fmt, arg...)                                                              \
37     kthread_create_on_node(thread_fn, data, NUMA_NO_NODE, name_fmt, ##arg)
38 
39 /**
40  * @brief 创建内核线程,并将其唤醒
41  *
42  * @param thread_fn 该内核线程要执行的函数
43  * @param data 传递给 thread_fn 的参数数据
44  * @param name_fmt printf-style format string for the thread name
45  * @param arg name_fmt的参数
46  */
47 #define kthread_run(thread_fn, data, name_fmt, ...)                                                          \
48     ({                                                                                                       \
49         struct process_control_block *__kt = kthread_create(thread_fn, data, name_fmt, ##__VA_ARGS__); \
50         if (!IS_ERR(__kt))                                                                                   \
51             process_wakeup(__kt);                                                                            \
52         __kt;                                                                                                \
53     })
54 
55 /**
56  * @brief 创建内核实时线程,并将其唤醒
57  *
58  * @param thread_fn 该内核线程要执行的函数
59  * @param data 传递给 thread_fn 的参数数据
60  * @param name_fmt printf-style format string for the thread name
61  * @param arg name_fmt的参数
62  */
63 #define kthread_run_rt(thread_fn, data, name_fmt, ...)                                                                 \
64     ({                                                                                                                 \
65         struct process_control_block *__kt = kthread_create(thread_fn, data, name_fmt, ##__VA_ARGS__);                 \
66         __kt = process_init_rt_pcb(__kt);                                                                              \
67         if (!IS_ERR(__kt))                                                                                             \
68         {                                                                                                              \
69             process_wakeup(__kt);                                                                                      \
70         }                                                                                                              \
71         __kt;                                                                                                          \
72     })
73 
74 /**
75  * @brief 向kthread发送停止信号,请求其结束
76  *
77  * @param pcb 内核线程的pcb
78  * @return int 错误码
79  */
80 int kthread_stop(struct process_control_block *pcb);
81 
82 /**
83  * @brief 内核线程调用该函数,检查自身的标志位,判断自己是否应该执行完任务后退出
84  *
85  * @return true 内核线程应该退出
86  * @return false 无需退出
87  */
88 bool kthread_should_stop(void);
89 
90 /**
91  * @brief 让当前内核线程退出,并返回result参数给kthread_stop()函数
92  *
93  * @param result 返回值
94  */
95 void kthread_exit(long result);
96 
97 /**
98  * @brief 初始化kthread机制(只应被process_init调用)
99  *
100  * @return int 错误码
101  */
102 int kthread_mechanism_init();
103 
104 /**
105  * @brief 设置pcb中的worker_private字段(只应被设置一次)
106  *
107  * @param pcb pcb
108  * @return bool 成功或失败
109  */
110 bool kthread_set_worker_private(struct process_control_block *pcb);
111 
112 /**
113  * @brief 获取pcb中的kthread结构体
114  *
115  * @param pcb pcb
116  * @return struct kthread* kthread信息结构体
117  */
118 struct kthread_info_t *to_kthread(struct process_control_block *pcb);
119 
120 /**
121  * @brief 释放pcb指向的worker private
122  *
123  * @param pcb 要释放的pcb
124  */
125 void free_kthread_struct(struct process_control_block *pcb);