From cb51da8166e4aea9e8258c0946be4afae35adfab Mon Sep 17 00:00:00 2001 From: rhunk <101876869+rhunk@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:52:29 +0200 Subject: [PATCH] fix(core): bridge concurrent resume continuation --- .../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 index c4464cb1..613e4c63 100644 --- 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? = null + private val connectSemaphore = Semaphore(permits = 1) + private val reconnectSemaphore = Semaphore(permits = 1) private lateinit var service: BridgeInterface private val onConnectedCallbacks = mutableListOf 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 {