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);