@@ -20,7 +20,9 @@ import java.net.UnknownHostException
2020
2121object DefaultNetworkListener {
2222 private sealed class NetworkMessage {
23- class Start (val key : Any , val listener : (Network ? ) -> Unit ) : NetworkMessage()
23+ class Start (val key : Any , val listener : (Network ? ) -> Unit ) : NetworkMessage() {
24+ val processed = CompletableDeferred <Unit >()
25+ }
2426 class Get : NetworkMessage () {
2527 val response = CompletableDeferred <Network >()
2628 }
@@ -38,9 +40,16 @@ object DefaultNetworkListener {
3840 val pendingRequests = arrayListOf<NetworkMessage .Get >()
3941 for (message in channel) when (message) {
4042 is NetworkMessage .Start -> {
41- if (listeners.isEmpty()) register()
42- listeners[message.key] = message.listener
43- if (network != null ) message.listener(network)
43+ try {
44+ if (listeners.isEmpty()) register()
45+ listeners[message.key] = message.listener
46+ if (network != null ) message.listener(network)
47+ message.processed.complete(Unit )
48+ } catch (error: Throwable ) {
49+ val removed = listeners.remove(message.key) != null
50+ if (removed && listeners.isEmpty()) runCatching { unregister() }
51+ message.processed.completeExceptionally(error)
52+ }
4453 }
4554 is NetworkMessage .Get -> {
4655 check(listeners.isNotEmpty()) { " Getting network without any listeners is not supported" }
@@ -84,8 +93,14 @@ object DefaultNetworkListener {
8493 }
8594 }
8695
87- suspend fun start (key : Any , listener : (Network ? ) -> Unit ) =
88- networkActor.send(NetworkMessage .Start (key, listener))
96+ suspend fun start (key : Any , listener : (Network ? ) -> Unit ) {
97+ val message = NetworkMessage .Start (key, listener)
98+ networkActor.send(message)
99+ // send 只保证消息进入 actor,不保证 Start 分支和缓存网络的首次回调已经完成。
100+ // 必须等待 processed,否则并发创建测试 Box 时 Go monitor 可能以 default=nil 返回,
101+ // 随后的首拨会抢在 updateDefaultInterface(wlan0, index) 之前并立即失败。
102+ message.processed.await()
103+ }
89104
90105 suspend fun get () = if (fallback) @TargetApi(23 ) {
91106 SagerNet .connectivity.activeNetwork
0 commit comments