Browse Source

change(sched): move idle task out of ready queue

greatbridf 9 tháng trước cách đây
mục cha
commit
0b5c54c2cf

+ 2 - 0
include/kernel/task/readyqueue.hpp

@@ -9,6 +9,8 @@ namespace kernel::task::dispatcher {
 void enqueue(thread* thd);
 void dequeue(thread* thd);
 
+void setup_idle(thread* idle_thd);
+
 thread* next();
 
 } // namespace kernel::task

+ 1 - 1
src/kernel/process.cpp

@@ -300,7 +300,7 @@ proclist::proclist()
 
         __spawn(*thd, (uintptr_t)kernel_threadd_main);
 
-        kernel::task::dispatcher::enqueue(&thd);
+        kernel::task::dispatcher::setup_idle(&thd);
     }
 }
 

+ 16 - 19
src/kernel/task/readyqueue.cc

@@ -10,6 +10,12 @@ using kernel::async::mutex, kernel::async::lock_guard_irq;
 
 static mutex dispatcher_mtx;
 static std::list<thread*> dispatcher_thds;
+static thread* idle_task;
+
+void dispatcher::setup_idle(thread* _idle)
+{
+    idle_task = _idle;
+}
 
 void dispatcher::enqueue(thread* thd)
 {
@@ -28,28 +34,19 @@ void dispatcher::dequeue(thread* thd)
 thread* dispatcher::next()
 {
     lock_guard_irq lck(dispatcher_mtx);
-    auto back = dispatcher_thds.back();
 
-    if (dispatcher_thds.size() == 1) {
-        back->elected_times++;
-        return back;
+    if (dispatcher_thds.empty()) {
+        idle_task->elected_times++;
+        return idle_task;
     }
 
-    if (dispatcher_thds.size() == 2) {
-        if (back->owner == 0) {
-            auto front = dispatcher_thds.front();
-            front->elected_times++;
-            return front;
-        }
-        back->elected_times++;
-        return back;
-    }
-
-    auto* retval = dispatcher_thds.front();
+    auto* front = dispatcher_thds.front();
 
-    dispatcher_thds.pop_front();
-    dispatcher_thds.push_back(retval);
+    if (dispatcher_thds.size() != 1) {
+        dispatcher_thds.pop_front();
+        dispatcher_thds.push_back(front);
+    }
 
-    retval->elected_times++;
-    return retval;
+    front->elected_times++;
+    return front;
 }

+ 1 - 3
src/kernel/task/thread.cc

@@ -112,10 +112,8 @@ void thread::set_attr(thd_attr_t new_attr)
             break;
         }
 
-        if (attr & READY) {
-            kmsgf("[kernel:warn] pid%d tries to wake up from ready state", owner);
+        if (attr & READY)
             break;
-        }
 
         attr &= SYSTEM;
         attr |= READY;