]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/ipc_timeout.cpp
update
[l4.git] / kernel / fiasco / src / kern / ipc_timeout.cpp
index bbdae9732363975e085d21ec6e16b64baf50f2a5..9a382bb3a1ef84ee69b061c3c7547f24a981ca70 100644 (file)
@@ -55,10 +55,13 @@ IPC_timeout::expired()
 {
   Receiver * const _owner = owner();
 
-  // Set thread ready
-  _owner->state_change (~Thread_ipc_in_progress, Thread_ready);
+  Mword ipc_state = _owner->state() & Thread_ipc_mask;
+  if (!ipc_state || (ipc_state & Thread_receive_in_progress))
+    return false;
+
+  _owner->state_change_dirty(~Thread_ipc_mask, Thread_ready | Thread_timeout);
 
   // Flag reschedule if owner's priority is higher than the current
   // thread's (own or timeslice-donated) priority.
-  return _owner->sched()->deblock(current_cpu(), current()->sched(), false);
+  return Sched_context::rq.current().deblock(_owner->sched(), current()->sched(), false);
 }