Fix native CLI TCP regression path

This commit is contained in:
sergeych committed 2026-04-09 11:00:23 +03:00
1 parent aa1b74620e
commit 402b8bb1b3
14 files changed
+204 -22

No files matched your search

@@ -40,7 +40,10 @@ private class NativeKtorNetEngine(
override val isTcpServerAvailable: Boolean,
override val isUdpAvailable: Boolean,
) : LyngNetEngine {
private val selectorManager: SelectorManager by lazy { SelectorManager(Dispatchers.Default) }
private var selectorManager: SelectorManager? = null
private fun selectorManager(): SelectorManager =
selectorManager ?: SelectorManager(Dispatchers.Default).also { selectorManager = it }
override suspend fun resolve(host: String, port: Int): List<LyngSocketAddress> {
val rawAddress = InetSocketAddress(host, port).resolveAddress()
@@ -62,7 +65,7 @@ private class NativeKtorNetEngine(
noDelay: Boolean,
): LyngTcpSocket {
val connectBlock: suspend () -> Socket = {
aSocket(selectorManager).tcp().connect(host, port) {
aSocket(selectorManager()).tcp().connect(host, port) {
this.noDelay = noDelay
}
}
@@ -77,7 +80,7 @@ private class NativeKtorNetEngine(
reuseAddress: Boolean,
): LyngTcpServer {
val bindHost = host ?: "0.0.0.0"
val server = aSocket(selectorManager).tcp().bind(bindHost, port) {
val server = aSocket(selectorManager()).tcp().bind(bindHost, port) {
backlogSize = backlog
this.reuseAddress = reuseAddress
}
@@ -86,11 +89,16 @@ private class NativeKtorNetEngine(
override suspend fun udpBind(host: String?, port: Int, reuseAddress: Boolean): LyngUdpSocket {
val bindHost = host ?: "0.0.0.0"
val socket = aSocket(selectorManager).udp().bind(bindHost, port) {
val socket = aSocket(selectorManager()).udp().bind(bindHost, port) {
this.reuseAddress = reuseAddress
}
return NativeLyngUdpSocket(socket)
}
fun shutdown() {
selectorManager?.close()
selectorManager = null
}
}
private class NativeLyngTcpSocket(
@@ -214,3 +222,7 @@ private fun ByteArray.toIpHostString(): String = when (size) {
}
else -> error("Unsupported IP address length: $size")
}
internal fun shutdownNativeKtorNetEngine(engine: LyngNetEngine) {
(engine as? NativeKtorNetEngine)?.shutdown()
}