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 private val context: ModContext
): ServiceConnection { ): ServiceConnection {
private var continuation: Continuation<Boolean>? = null private var continuation: Continuation<Boolean>? = null
private val connectSemaphore = Semaphore(permits = 1)
private val reconnectSemaphore = Semaphore(permits = 1)
private lateinit var service: BridgeInterface private lateinit var service: BridgeInterface
private val onConnectedCallbacks = mutableListOf<suspend () -> Unit>() 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? { suspend fun connect(onFailure: (Throwable) -> Unit): Boolean? {
if (this::service.isInitialized && service.asBinder().pingBinder()) { if (this::service.isInitialized && service.asBinder().pingBinder()) {
return true return true
@ -92,8 +103,7 @@ class BridgeClient(
} }
}.onFailure { }.onFailure {
onFailure(it) onFailure(it)
continuation = null resumeContinuation(false)
cancellableContinuation.resume(false)
} }
} }
} }
@ -111,22 +121,17 @@ class BridgeClient(
} }
} }
} }
continuation?.resume(true) resumeContinuation(true)
continuation = null
} }
override fun onNullBinding(name: ComponentName) { override fun onNullBinding(name: ComponentName) {
Log.d("BridgeClient", "bridge null binding") resumeContinuation(false)
continuation?.resume(false)
continuation = null
} }
override fun onServiceDisconnected(name: ComponentName) { override fun onServiceDisconnected(name: ComponentName) {
continuation = null continuation = null
} }
private val reconnectSemaphore = Semaphore(permits = 1)
private fun tryReconnect() { private fun tryReconnect() {
runBlocking { runBlocking {
reconnectSemaphore.withPermit { reconnectSemaphore.withPermit {