// This is called every IPC_HLE_PERIOD from SystemTimers.cpp // Takes care of routing ipc <-> ipc HLE void Update() { if (!WII_IPCInterface::IsReady()) return; if (request_queue.size()) { WII_IPCInterface::GenerateAck(request_queue.front()); INFO_LOG(WII_IPC_HLE, "||-- Acknowledge IPC Request @ 0x%08x", request_queue.front()); u32 command = request_queue.front(); request_queue.pop_front(); ExecuteCommand(command); return; } if (reply_queue.size()) { WII_IPCInterface::GenerateReply(reply_queue.front()); INFO_LOG(WII_IPC_HLE, "<<-- Reply to IPC Request @ 0x%08x", reply_queue.front()); reply_queue.pop_front(); return; } if (ack_queue.size()) { WII_IPCInterface::GenerateAck(ack_queue.front()); WARN_LOG(WII_IPC_HLE, "<<-- Double-ack to IPC Request @ 0x%08x", ack_queue.front()); ack_queue.pop_front(); return; } }
// This is called every IPC_HLE_PERIOD from SystemTimers.cpp // Takes care of routing ipc <-> ipc HLE void Update() { if (!WII_IPCInterface::IsReady()) return; UpdateDevices(); if (request_queue.size()) { WII_IPCInterface::GenerateAck(request_queue.front()); INFO_LOG(WII_IPC_HLE, "||-- Acknowledge IPC Request @ 0x%08x", request_queue.front()); u32 command = request_queue.front(); request_queue.pop_front(); ExecuteCommand(command); #if MAX_LOGLEVEL >= DEBUG_LEVEL Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_HLE, LogTypes::LDEBUG); #endif } // lock due to using reply_queue { std::lock_guard<std::mutex> lk(s_reply_queue); if (reply_queue.size()) { WII_IPCInterface::GenerateReply(reply_queue.front()); INFO_LOG(WII_IPC_HLE, "<<-- Reply to IPC Request @ 0x%08x", reply_queue.front()); reply_queue.pop_front(); } } }