Skip to content

Commit a02ddbc

Browse files
committed
fix: close channels in AdbMdns properly
1 parent 8536bc4 commit a02ddbc

File tree

1 file changed

+14
-18
lines changed
  • sysbridge/src/main/java/io/github/sds100/keymapper/sysbridge/adb

1 file changed

+14
-18
lines changed

sysbridge/src/main/java/io/github/sds100/keymapper/sysbridge/adb/AdbMdns.kt

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -34,38 +34,38 @@ internal class AdbMdns(
3434

3535
private val nsdManager: NsdManager = ctx.getSystemService(NsdManager::class.java)
3636

37-
private val serviceDiscoveredChannel: Channel<NsdServiceInfo> = Channel(capacity = 10)
37+
private var serviceDiscoveredChannel: Channel<NsdServiceInfo>? = null
3838

3939
/**
4040
* Only one service can be resolved at a time.
4141
* A null value is sent if the service failed to resolve.
4242
*/
43-
private val serviceResolvedChannel: Channel<NsdServiceInfo?> = Channel(capacity = 1)
43+
private var serviceResolvedChannel: Channel<NsdServiceInfo?>? = null
4444

4545
private val isDiscovering: MutableStateFlow<Boolean> = MutableStateFlow(false)
4646
private val discoveredPort: MutableStateFlow<Int?> = MutableStateFlow(null)
4747
private val discoverMutex: Mutex = Mutex()
4848

4949
private val resolveListener: NsdManager.ResolveListener = object : NsdManager.ResolveListener {
5050
override fun onResolveFailed(nsdServiceInfo: NsdServiceInfo, i: Int) {
51-
serviceResolvedChannel.trySendBlocking(null)
51+
serviceResolvedChannel?.trySendBlocking(null)
5252
}
5353

5454
override fun onServiceResolved(nsdServiceInfo: NsdServiceInfo) {
5555
Timber.d("onServiceResolved: ${nsdServiceInfo.serviceName} ${nsdServiceInfo.host} ${nsdServiceInfo.port} ${nsdServiceInfo.serviceType}")
56-
serviceResolvedChannel.trySendBlocking(nsdServiceInfo)
56+
serviceResolvedChannel?.trySendBlocking(nsdServiceInfo)
5757
}
5858

5959
override fun onResolutionStopped(serviceInfo: NsdServiceInfo) {
6060
super.onResolutionStopped(serviceInfo)
6161

62-
serviceResolvedChannel.trySendBlocking(null)
62+
serviceResolvedChannel?.trySendBlocking(null)
6363
}
6464

6565
override fun onStopResolutionFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
6666
super.onStopResolutionFailed(serviceInfo, errorCode)
6767

68-
serviceResolvedChannel.trySendBlocking(null)
68+
serviceResolvedChannel?.trySendBlocking(null)
6969
}
7070
}
7171

@@ -95,7 +95,7 @@ internal class AdbMdns(
9595
Timber.d("onServiceFound: ${serviceInfo.serviceName} ${serviceInfo.host} ${serviceInfo.port} ${serviceInfo.serviceType}")
9696

9797
// You can only resolve one service at a time and they can take some time to resolve.
98-
serviceDiscoveredChannel.trySend(serviceInfo)
98+
serviceDiscoveredChannel?.trySend(serviceInfo)
9999
}
100100

101101
override fun onServiceLost(serviceInfo: NsdServiceInfo) {
@@ -129,6 +129,9 @@ internal class AdbMdns(
129129
// Wait for it to stop discovering
130130
isDiscovering.first { !it }
131131

132+
serviceDiscoveredChannel = Channel(capacity = 10)
133+
serviceResolvedChannel = Channel(capacity = 1)
134+
132135
nsdManager.discoverServices(
133136
serviceType.id,
134137
NsdManager.PROTOCOL_DNS_SD,
@@ -138,10 +141,10 @@ internal class AdbMdns(
138141
try {
139142
withTimeout(10000L) {
140143
while (port == null) {
141-
val service = serviceDiscoveredChannel.receive()
144+
val service = serviceDiscoveredChannel?.receive()
142145
nsdManager.resolveService(service, resolveListener)
143146

144-
val resolvedService = serviceResolvedChannel.receive()
147+
val resolvedService = serviceResolvedChannel?.receive()
145148

146149
if (resolvedService == null) {
147150
continue
@@ -183,15 +186,8 @@ internal class AdbMdns(
183186
nsdManager.stopServiceDiscovery(discoveryListener)
184187
}
185188

186-
// Clear the resolve channel if there is anything left.
187-
while (!serviceResolvedChannel.isEmpty) {
188-
serviceResolvedChannel.tryReceive()
189-
}
190-
191-
// Clear the discovered channel if there is anything left.
192-
while (!serviceDiscoveredChannel.isEmpty) {
193-
serviceDiscoveredChannel.tryReceive()
194-
}
189+
serviceResolvedChannel?.cancel()
190+
serviceDiscoveredChannel?.cancel()
195191
}
196192

197193
private fun isPortAvailable(port: Int): Boolean {

0 commit comments

Comments
 (0)