PRIVATE void Thread::ipc_send_msg(Receiver *recv) { Syscall_frame *regs = _snd_regs; bool success = transfer_msg(regs->tag(), nonull_static_cast<Thread*>(recv), regs, _ipc_send_rights); sender_dequeue(recv->sender_list()); recv->vcpu_update_state(); //printf(" done\n"); regs->tag(L4_msg_tag(regs->tag(), success ? 0 : L4_msg_tag::Error)); Mword state_del = Thread_ipc_mask | Thread_ipc_transfer; Mword state_add = Thread_ready; if (Receiver::prepared()) // same as in Receiver::prepare_receive_dirty_2 state_add |= Thread_receive_wait; if (cpu() == current_cpu()) { state_change_dirty(~state_del, state_add); if (current_sched()->deblock(cpu(), current_sched(), true)) recv->switch_to_locked(this); } else { drq_state_change(~state_del, state_add); current()->schedule_if(current()->handle_drq()); } }
virtual void Ipc_sender<Derived>::ipc_send_msg(Receiver *recv) { derived()->transfer_msg(recv); if (derived()->dequeue_sender()) { sender_dequeue(recv->sender_list()); recv->vcpu_update_state(); } }
void Sender::sender_update_prio(P_LIST list, unsigned short newprio) { if(EXPECT_FALSE(sender_prio() == newprio)) return; Lock_guard<Cpu_lock> guard (&cpu_lock); if (!in_sender_list()) return; sender_dequeue(list); sender_enqueue(list, newprio); }