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:
JosJuice 2023-06-11 12:18:16 +02:00
parent 5524042922
commit 3519a7070d
2 changed files with 29 additions and 9 deletions

View File

@ -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;
}; };

View File

@ -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());