Merge pull request #3989 from JosJuice/insert-sd-thread
Don't ScheduleEvent from wrong thread when inserting SD card
This commit is contained in:
commit
4d2df0a8ce
|
@ -32,6 +32,7 @@ They will also generate a true or false return for UpdateInterrupts() in WII_IPC
|
||||||
#include "Common/Thread.h"
|
#include "Common/Thread.h"
|
||||||
|
|
||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
|
#include "Core/Core.h"
|
||||||
#include "Core/CoreTiming.h"
|
#include "Core/CoreTiming.h"
|
||||||
#include "Core/Debugger/Debugger_SymbolMap.h"
|
#include "Core/Debugger/Debugger_SymbolMap.h"
|
||||||
#include "Core/HW/CPU.h"
|
#include "Core/HW/CPU.h"
|
||||||
|
@ -76,6 +77,7 @@ static ipc_msg_queue reply_queue; // arm -> ppc
|
||||||
static ipc_msg_queue ack_queue; // arm -> ppc
|
static ipc_msg_queue ack_queue; // arm -> ppc
|
||||||
|
|
||||||
static int event_enqueue;
|
static int event_enqueue;
|
||||||
|
static int event_sdio_notify;
|
||||||
|
|
||||||
static u64 last_reply_time;
|
static u64 last_reply_time;
|
||||||
|
|
||||||
|
@ -98,6 +100,14 @@ static void EnqueueEvent(u64 userdata, s64 cycles_late = 0)
|
||||||
Update();
|
Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDIO_EventNotify_CPUThread(u64 userdata, s64 cycles_late)
|
||||||
|
{
|
||||||
|
auto device =
|
||||||
|
static_cast<CWII_IPC_HLE_Device_sdio_slot0*>(GetDeviceByName("/dev/sdio/slot0").get());
|
||||||
|
if (device)
|
||||||
|
device->EventNotify();
|
||||||
|
}
|
||||||
|
|
||||||
static u32 num_devices;
|
static u32 num_devices;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -148,6 +158,7 @@ void Init()
|
||||||
AddDevice<IWII_IPC_HLE_Device>("_Unimplemented_Device_");
|
AddDevice<IWII_IPC_HLE_Device>("_Unimplemented_Device_");
|
||||||
|
|
||||||
event_enqueue = CoreTiming::RegisterEvent("IPCEvent", EnqueueEvent);
|
event_enqueue = CoreTiming::RegisterEvent("IPCEvent", EnqueueEvent);
|
||||||
|
event_sdio_notify = CoreTiming::RegisterEvent("SDIO_EventNotify", SDIO_EventNotify_CPUThread);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Reset(bool _bHard)
|
void Reset(bool _bHard)
|
||||||
|
@ -212,10 +223,10 @@ void ES_DIVerify(const std::vector<u8>& tmd)
|
||||||
|
|
||||||
void SDIO_EventNotify()
|
void SDIO_EventNotify()
|
||||||
{
|
{
|
||||||
auto pDevice =
|
// TODO: Potential race condition: If IsRunning() becomes false after
|
||||||
static_cast<CWII_IPC_HLE_Device_sdio_slot0*>(GetDeviceByName("/dev/sdio/slot0").get());
|
// it's checked, an event may be scheduled after CoreTiming shuts down.
|
||||||
if (pDevice)
|
if (SConfig::GetInstance().bWii && Core::IsRunning())
|
||||||
pDevice->EventNotify();
|
CoreTiming::ScheduleEvent_Threadsafe(0, event_sdio_notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
int getFreeDeviceId()
|
int getFreeDeviceId()
|
||||||
|
|
|
@ -49,6 +49,8 @@ void CWII_IPC_HLE_Device_sdio_slot0::DoState(PointerWrap& p)
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_sdio_slot0::EventNotify()
|
void CWII_IPC_HLE_Device_sdio_slot0::EventNotify()
|
||||||
{
|
{
|
||||||
|
// Accessing SConfig variables like this isn't really threadsafe,
|
||||||
|
// but this is how it's done all over the place...
|
||||||
if ((SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_INSERT) ||
|
if ((SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_INSERT) ||
|
||||||
(!SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_REMOVE))
|
(!SConfig::GetInstance().m_WiiSDCard && m_event.type == EVENT_REMOVE))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue