Skip to content

Commit

Permalink
Merge pull request #3101 from JosJuice/change-disc-fix
Browse files Browse the repository at this point in the history
Synchronize DVDInterface::ChangeDisc with the CPU thread properly
  • Loading branch information
degasus committed Nov 16, 2015
2 parents 34bfb1b + e602eac commit 1f3a81c
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 6 deletions.
5 changes: 3 additions & 2 deletions Source/Core/Core/Core.cpp
Expand Up @@ -276,7 +276,7 @@ void Stop() // - Hammertime!
}
}

static void DeclareAsCPUThread()
void DeclareAsCPUThread()
{
#ifdef ThreadLocalStorage
tls_is_cpu_thread = true;
Expand All @@ -288,7 +288,7 @@ static void DeclareAsCPUThread()
#endif
}

static void UndeclareAsCPUThread()
void UndeclareAsCPUThread()
{
#ifdef ThreadLocalStorage
tls_is_cpu_thread = false;
Expand Down Expand Up @@ -715,6 +715,7 @@ bool PauseAndLock(bool doLock, bool unpauseOnUnlock)

// video has to come after CPU, because CPU thread can wait for video thread (s_efbAccessRequested).
g_video_backend->PauseAndLock(doLock, unpauseOnUnlock);

return wasUnpaused;
}

Expand Down
3 changes: 3 additions & 0 deletions Source/Core/Core/Core.h
Expand Up @@ -41,6 +41,9 @@ bool Init();
void Stop();
void Shutdown();

void DeclareAsCPUThread();
void UndeclareAsCPUThread();

std::string StopMessage(bool, const std::string&);

bool IsRunning();
Expand Down
15 changes: 14 additions & 1 deletion Source/Core/Core/HW/CPU.cpp
Expand Up @@ -149,13 +149,22 @@ void Break()

bool PauseAndLock(bool do_lock, bool unpause_on_unlock)
{
static bool s_have_fake_cpu_thread;
bool wasUnpaused = !IsStepping();
if (do_lock)
{
// we can't use EnableStepping, that would causes deadlocks with both audio and video
PowerPC::Pause();
if (!Core::IsCPUThread())
{
m_csCpuOccupied.lock();
s_have_fake_cpu_thread = true;
Core::DeclareAsCPUThread();
}
else
{
s_have_fake_cpu_thread = false;
}
}
else
{
Expand All @@ -165,8 +174,12 @@ bool PauseAndLock(bool do_lock, bool unpause_on_unlock)
m_StepEvent.Set();
}

if (!Core::IsCPUThread())
if (s_have_fake_cpu_thread)
{
Core::UndeclareAsCPUThread();
m_csCpuOccupied.unlock();
s_have_fake_cpu_thread = false;
}
}
return wasUnpaused;
}
Expand Down
10 changes: 7 additions & 3 deletions Source/Core/Core/HW/DVDInterface.cpp
Expand Up @@ -14,6 +14,7 @@
#include "Common/MathUtil.h"

#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/CoreTiming.h"
#include "Core/Movie.h"
#include "Core/HW/AudioInterface.h"
Expand Down Expand Up @@ -522,10 +523,11 @@ void InsertDiscCallback(u64 userdata, int cyclesLate)

void ChangeDisc(const std::string& newFileName)
{
bool is_cpu = Core::IsCPUThread();
bool was_unpaused = is_cpu ? false : Core::PauseAndLock(true);
std::string* _FileName = new std::string(newFileName);
CoreTiming::ScheduleEvent_Threadsafe(0, ejectDisc);
CoreTiming::ScheduleEvent_Threadsafe(500000000, insertDisc, (u64)_FileName);
// TODO: We shouldn't be modifying movie state from the GUI thread.
CoreTiming::ScheduleEvent(0, ejectDisc);
CoreTiming::ScheduleEvent(500000000, insertDisc, (u64)_FileName);
if (Movie::IsRecordingInput())
{
Movie::g_bDiscChange = true;
Expand All @@ -538,6 +540,8 @@ void ChangeDisc(const std::string& newFileName)
}
Movie::g_discChange = fileName.substr(sizeofpath);
}
if (!is_cpu)
Core::PauseAndLock(false, was_unpaused);
}

void SetLidOpen(bool _bOpen)
Expand Down

0 comments on commit 1f3a81c

Please sign in to comment.