+static void _priority_readyq_enqueue(task_t* task, bool at_head) {
+ assert(task != NULL);
+
+ int priority = task->priority;
+
+ assert(priority >= TASK_PRIORITY_MIN);
+ assert(priority <= TASK_PRIORITY_MAX);
+
+ if (at_head) {
+ list_add(&task->ready_list, g_priority_readyq.lists + priority);
+ } else {
+ list_add_tail(&task->ready_list, g_priority_readyq.lists + priority);
+ }
+
+ priority_readyq_set_bit(priority);
+}
+
+void priority_readyq_enqueue_head(task_t* task) {
+ _priority_readyq_enqueue(task, true);
+}
+
+void priority_readyq_enqueue_tail(task_t* task) {
+ _priority_readyq_enqueue(task, false);
+}
+
+void priority_readyq_unlink(task_t* task) {
+ assert(task != NULL);
+
+ int priority = task->priority;
+
+ assert(priority >= TASK_PRIORITY_MIN);
+ assert(priority <= TASK_PRIORITY_MAX);
+
+ assert(!list_empty(&task->ready_list));
+
+ list_del_init(&task->ready_list);
+
+ if (list_empty(g_priority_readyq.lists + priority)) {
+ priority_readyq_clear_bit(priority);
+ }
+}
+
+bool priority_readyq_has_higher_priority_task(int priority) {
+ assert(priority >= TASK_PRIORITY_MIN);
+ assert(priority <= TASK_PRIORITY_MAX);
+
+ int end_index = priority / READYQ_BITS_PER_WORD;
+ int bit_index = priority % READYQ_BITS_PER_WORD;
+
+ for (int i = 0; i < end_index; i++) {
+ if (g_priority_readyq.bitmap[i] != 0) {
+ return true;
+ }
+ }
+
+ // 虽然bit_index为0的情况下这个if必不满足,但不影响逻辑正确性
+ if (g_priority_readyq.bitmap[end_index] & ((1U << bit_index) - 1)) {
+ return true;
+ }
+
+ return false;
+}
+