From b423004ab3892da03484cd5ad8e662dc7743b83c Mon Sep 17 00:00:00 2001 From: magumagu Date: Sat, 14 Jun 2014 10:56:11 -0700 Subject: [PATCH] IPCHLE: use only one CoreTiming event. --- Source/Core/Core/IPC_HLE/WII_IPC_HLE.cpp | 39 +++++++++++------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/Source/Core/Core/IPC_HLE/WII_IPC_HLE.cpp b/Source/Core/Core/IPC_HLE/WII_IPC_HLE.cpp index d6ccf7254e..7e2e586e87 100644 --- a/Source/Core/Core/IPC_HLE/WII_IPC_HLE.cpp +++ b/Source/Core/Core/IPC_HLE/WII_IPC_HLE.cpp @@ -78,27 +78,26 @@ static ipc_msg_queue request_queue; // ppc -> arm static ipc_msg_queue reply_queue; // arm -> ppc static ipc_msg_queue ack_queue; // arm -> ppc -static int event_enqueue_reply; -static int event_enqueue_request; +static int event_enqueue; static u64 last_reply_time; -static const u64 ENQUEUE_ACKNOWLEDGEMENT_FLAG = 0x100000000ULL; -static void EnqueueReplyCallback(u64 userdata, int) +static const u64 ENQUEUE_REQUEST_FLAG = 0x100000000ULL; +static const u64 ENQUEUE_ACKNOWLEDGEMENT_FLAG = 0x200000000ULL; +static void EnqueueEventCallback(u64 userdata, int) { if (userdata & ENQUEUE_ACKNOWLEDGEMENT_FLAG) { ack_queue.push_back((u32)userdata); - Update(); - return; } - reply_queue.push_back((u32)userdata); - Update(); -} - -static void EnqueueRequestCallback(u64 userdata, int) -{ - request_queue.push_back((u32)userdata); + else if (userdata & ENQUEUE_REQUEST_FLAG) + { + request_queue.push_back((u32)userdata); + } + else + { + reply_queue.push_back((u32)userdata); + } Update(); } @@ -144,14 +143,12 @@ void Init() g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, "/dev/usb/oh1"); i++; g_DeviceMap[i] = new IWII_IPC_HLE_Device(i, "_Unimplemented_Device_"); i++; - event_enqueue_reply = CoreTiming::RegisterEvent("IPCReply", EnqueueReplyCallback); - event_enqueue_request = CoreTiming::RegisterEvent("IPCRequest", EnqueueRequestCallback); + event_enqueue = CoreTiming::RegisterEvent("IPCEvent", EnqueueEventCallback); } void Reset(bool _bHard) { - CoreTiming::RemoveAllEvents(event_enqueue_reply); - CoreTiming::RemoveAllEvents(event_enqueue_request); + CoreTiming::RemoveAllEvents(event_enqueue); for (IWII_IPC_HLE_Device*& dev : g_FdMap) { @@ -567,7 +564,7 @@ void ExecuteCommand(u32 _Address) // Happens AS SOON AS IPC gets a new pointer! void EnqueueRequest(u32 address) { - CoreTiming::ScheduleEvent(1000, event_enqueue_request, address); + CoreTiming::ScheduleEvent(1000, event_enqueue, address | ENQUEUE_REQUEST_FLAG); } // Called when IOS module has some reply @@ -576,17 +573,17 @@ void EnqueueRequest(u32 address) // Please search for examples of this being called elsewhere. void EnqueueReply(u32 address, int cycles_in_future) { - CoreTiming::ScheduleEvent(cycles_in_future, event_enqueue_reply, address); + CoreTiming::ScheduleEvent(cycles_in_future, event_enqueue, address); } void EnqueueReply_Threadsafe(u32 address, int cycles_in_future) { - CoreTiming::ScheduleEvent_Threadsafe(cycles_in_future, event_enqueue_reply, address); + CoreTiming::ScheduleEvent_Threadsafe(cycles_in_future, event_enqueue, address); } void EnqueueCommandAcknowledgement(u32 address, int cycles_in_future) { - CoreTiming::ScheduleEvent(cycles_in_future, event_enqueue_reply, + CoreTiming::ScheduleEvent(cycles_in_future, event_enqueue, address | ENQUEUE_ACKNOWLEDGEMENT_FLAG); }