mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-05-29 21:10:20 +02:00
fix(core): bridge concurrent resume continuation
This commit is contained in:
parent
67c51775cf
commit
cb51da8166
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user