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:
Mcore/src/main/kotlin/me/rhunk/snapenhance/core/bridge/BridgeClient.kt | 23++++++++++++++---------
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 {