summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2026-07-12 10:05:14 +0200
committerJosJuice <josjuice@gmail.com>2026-07-12 10:20:58 +0200
commit05855a37f4d6b9e98e41e7c50983faa167ae03ac (patch)
tree7993058da57bcbfe955a9457d51d9be3a1853b7b
parent6de526c684ee6dd8b6fc3447dae858ae480ccbb5 (diff)
GCAdapter: Deregister callback when scan thread exits
We were registering the hotplug callback when starting the thread, but deregistering it when shutting down GCAdapter as a whole. Because the thread can start and stop potentially many times before GCAdapter shuts down, this led to callbacks being registered when we already have callbacks. On Android, this was making Dolphin's Kotlin code for registering the callback throw an IllegalStateException. To fix this, deregister the callback when stopping the thread.
-rw-r--r--Source/Core/InputCommon/GCAdapter.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/Source/Core/InputCommon/GCAdapter.cpp b/Source/Core/InputCommon/GCAdapter.cpp
index e11d95d68f..dbffc4d81d 100644
--- a/Source/Core/InputCommon/GCAdapter.cpp
+++ b/Source/Core/InputCommon/GCAdapter.cpp
@@ -473,6 +473,17 @@ static void ScanThreadFunc()
}
#endif
+#if GCADAPTER_USE_LIBUSB_IMPLEMENTATION
+#if LIBUSB_API_HAS_HOTPLUG
+ if (s_libusb_hotplug_enabled)
+ libusb_hotplug_deregister_callback(*s_libusb_context, s_hotplug_handle);
+#endif
+#elif GCADAPTER_USE_ANDROID_IMPLEMENTATION
+ const jmethodID disable_hotplug_callback_func =
+ env->GetStaticMethodID(s_adapter_class, "disableHotplugCallback", "()V");
+ env->CallStaticVoidMethod(s_adapter_class, disable_hotplug_callback_func);
+#endif
+
NOTICE_LOG_FMT(CONTROLLERINTERFACE, "GC Adapter scanning thread stopped");
}
@@ -761,17 +772,6 @@ static void AddGCAdapter(libusb_device* device)
void Shutdown()
{
StopScanThread();
-#if GCADAPTER_USE_LIBUSB_IMPLEMENTATION
-#if LIBUSB_API_HAS_HOTPLUG
- if (s_libusb_context && s_libusb_context->IsValid() && s_libusb_hotplug_enabled)
- libusb_hotplug_deregister_callback(*s_libusb_context, s_hotplug_handle);
-#endif
-#elif GCADAPTER_USE_ANDROID_IMPLEMENTATION
- JNIEnv* const env = IDCache::GetEnvForThread();
- const jmethodID disable_hotplug_callback_func =
- env->GetStaticMethodID(s_adapter_class, "disableHotplugCallback", "()V");
- env->CallStaticVoidMethod(s_adapter_class, disable_hotplug_callback_func);
-#endif
Reset();
#if GCADAPTER_USE_LIBUSB_IMPLEMENTATION