fix(core): bridge concurrent resume continuation

This commit is contained in:
rhunk 2024-06-01 23:52:29 +02:00
parent 67c51775cf
commit cb51da8166

View File

@ -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 {