mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-05-28 12:30:12 +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
|
||||
): 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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user