mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
Android: And Lock and Unlock wrappers to HostThreadLock
This way we can ensure DeclareAsHostThread and UndeclareAsHostThread are called when locking and unlocking.
This commit is contained in:
parent
5524042922
commit
3519a7070d
@ -12,13 +12,33 @@
|
|||||||
// sequentially for access.
|
// sequentially for access.
|
||||||
struct HostThreadLock
|
struct HostThreadLock
|
||||||
{
|
{
|
||||||
static std::mutex s_host_identity_mutex;
|
public:
|
||||||
std::unique_lock<std::mutex> m_lock;
|
|
||||||
|
|
||||||
explicit HostThreadLock() : m_lock(s_host_identity_mutex) { Core::DeclareAsHostThread(); }
|
explicit HostThreadLock() : m_lock(s_host_identity_mutex) { Core::DeclareAsHostThread(); }
|
||||||
|
|
||||||
|
~HostThreadLock()
|
||||||
|
{
|
||||||
|
if (m_lock.owns_lock())
|
||||||
|
Core::UndeclareAsHostThread();
|
||||||
|
}
|
||||||
|
|
||||||
HostThreadLock(const HostThreadLock& other) = delete;
|
HostThreadLock(const HostThreadLock& other) = delete;
|
||||||
HostThreadLock(HostThreadLock&& other) = delete;
|
HostThreadLock(HostThreadLock&& other) = delete;
|
||||||
HostThreadLock& operator=(const HostThreadLock& other) = delete;
|
HostThreadLock& operator=(const HostThreadLock& other) = delete;
|
||||||
HostThreadLock& operator=(HostThreadLock&& other) = delete;
|
HostThreadLock& operator=(HostThreadLock&& other) = delete;
|
||||||
~HostThreadLock() { Core::UndeclareAsHostThread(); }
|
|
||||||
|
void Lock()
|
||||||
|
{
|
||||||
|
m_lock.lock();
|
||||||
|
Core::DeclareAsHostThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Unlock()
|
||||||
|
{
|
||||||
|
m_lock.unlock();
|
||||||
|
Core::UndeclareAsHostThread();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::mutex s_host_identity_mutex;
|
||||||
|
std::unique_lock<std::mutex> m_lock;
|
||||||
};
|
};
|
||||||
|
@ -447,9 +447,9 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SurfaceDestr
|
|||||||
while (s_is_booting.IsSet())
|
while (s_is_booting.IsSet())
|
||||||
{
|
{
|
||||||
// Need to wait for boot to finish before we can pause
|
// Need to wait for boot to finish before we can pause
|
||||||
host_identity_guard.m_lock.unlock();
|
host_identity_guard.Unlock();
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||||
host_identity_guard.m_lock.lock();
|
host_identity_guard.Lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Core::GetState() == Core::State::Running)
|
if (Core::GetState() == Core::State::Running)
|
||||||
@ -572,15 +572,15 @@ static void Run(JNIEnv* env, std::unique_ptr<BootParameters>&& boot, bool riivol
|
|||||||
|
|
||||||
while (Core::IsRunning())
|
while (Core::IsRunning())
|
||||||
{
|
{
|
||||||
host_identity_guard.m_lock.unlock();
|
host_identity_guard.Unlock();
|
||||||
s_update_main_frame_event.Wait();
|
s_update_main_frame_event.Wait();
|
||||||
host_identity_guard.m_lock.lock();
|
host_identity_guard.Lock();
|
||||||
Core::HostDispatchJobs();
|
Core::HostDispatchJobs();
|
||||||
}
|
}
|
||||||
|
|
||||||
s_game_metadata_is_valid = false;
|
s_game_metadata_is_valid = false;
|
||||||
Core::Shutdown();
|
Core::Shutdown();
|
||||||
host_identity_guard.m_lock.unlock();
|
host_identity_guard.Unlock();
|
||||||
|
|
||||||
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(),
|
env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(),
|
||||||
IDCache::GetFinishEmulationActivity());
|
IDCache::GetFinishEmulationActivity());
|
||||||
|
Loading…
Reference in New Issue
Block a user