Răsfoiți Sursa

task: fix park and unpark memory order

greatbridf 9 luni în urmă
părinte
comite
fe2b07f8b5
3 a modificat fișierele cu 5 adăugiri și 13 ștergeri
  1. 1 1
      Cargo.toml
  2. 3 7
      crates/eonix_runtime/src/task.rs
  3. 1 5
      src/kernel/task/thread.rs

+ 1 - 1
Cargo.toml

@@ -40,7 +40,7 @@ panic = "abort"
 opt-level = 0
 
 [profile.dev.package.eonix_preempt]
-opt-level = 0
+opt-level = 2
 
 [profile.dev.package.eonix_runtime]
 opt-level = 0

+ 3 - 7
crates/eonix_runtime/src/task.rs

@@ -149,19 +149,15 @@ impl Task {
             "Parking a task that is not running."
         );
 
-        if task.unparked.swap(false, Ordering::Release) {
+        if task.unparked.swap(false, Ordering::AcqRel) {
             // Someone has called `unpark` on this task previously.
-            let old_state = task.state.swap(TaskState::RUNNING);
-            assert_eq!(
-                old_state,
-                TaskState::PARKING,
-                "We should have just swapped the state to RUNNING."
-            );
+            task.state.swap(TaskState::RUNNING);
         } else {
             unsafe {
                 // SAFETY: Preemption is disabled.
                 Scheduler::goto_scheduler(&Task::current().execution_context)
             };
+            assert!(task.unparked.swap(false, Ordering::Acquire));
         }
 
         eonix_preempt::enable();

+ 1 - 5
src/kernel/task/thread.rs

@@ -363,16 +363,12 @@ impl Contexted for ThreadRunnable {
 impl Run for ThreadRunnable {
     type Output = ();
 
-    fn run(self: Pin<&mut Self>, waker: &Waker) -> RunState<Self::Output> {
+    fn run(self: Pin<&mut Self>, _waker: &Waker) -> RunState<Self::Output> {
         let mut task_context = ExecutionContext::new();
         task_context.set_interrupt(false);
         task_context.set_ip(_arch_fork_return as _);
         task_context.set_sp(&self.interrupt_context as *const _ as _);
 
-        self.thread
-            .signal_list
-            .set_signal_waker(Some(waker.clone()));
-
         eonix_preempt::disable();
 
         // TODO!!!!!: CHANGE THIS