commit cb51da8166e4aea9e8258c0946be4afae35adfab
parent 67c51775cf93b7a456b0c6d8f599df0782f025a5
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Sat, 1 Jun 2024 23:52:29 +0200
fix(core): bridge concurrent resume continuation
Diffstat:
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/core/bridge/BridgeClient.kt b/core/src/main/kotlin/me/rhunk/snapenhance/core/bridge/BridgeClient.kt
@@ -35,6 +35,8 @@ class BridgeClient(
private val context: ModContext
): ServiceConnection {
private var continuation: Continuation<Boolean>? = null
+ private val connectSemaphore = Semaphore(permits = 1)
+ private val reconnectSemaphore = Semaphore(permits = 1)
private lateinit var service: BridgeInterface
private val onConnectedCallbacks = mutableListOf<suspend () -> Unit>()
@@ -45,6 +47,15 @@ class BridgeClient(
}
}
+ private fun resumeContinuation(state: Boolean) {
+ runBlocking {
+ connectSemaphore.withPermit {
+ runCatching { continuation?.resume(state) }
+ continuation = null
+ }
+ }
+ }
+
suspend fun connect(onFailure: (Throwable) -> Unit): Boolean? {
if (this::service.isInitialized && service.asBinder().pingBinder()) {
return true
@@ -92,8 +103,7 @@ class BridgeClient(
}
}.onFailure {
onFailure(it)
- continuation = null
- cancellableContinuation.resume(false)
+ resumeContinuation(false)
}
}
}
@@ -111,22 +121,17 @@ class BridgeClient(
}
}
}
- continuation?.resume(true)
- continuation = null
+ resumeContinuation(true)
}
override fun onNullBinding(name: ComponentName) {
- Log.d("BridgeClient", "bridge null binding")
- continuation?.resume(false)
- continuation = null
+ resumeContinuation(false)
}
override fun onServiceDisconnected(name: ComponentName) {
continuation = null
}
- private val reconnectSemaphore = Semaphore(permits = 1)
-
private fun tryReconnect() {
runBlocking {
reconnectSemaphore.withPermit {