From 448361ddf5f27fc75a8bb0e5d973808653190939 Mon Sep 17 00:00:00 2001 From: Jorge Antonio Diaz-Benito Soriano Date: Tue, 9 Apr 2024 16:44:36 +0200 Subject: [PATCH 1/4] Disable broken targets https://youtrack.jetbrains.com/issue/KT-67064/KMP-cinterop-infers-incorrect-types-for-.def-declarations#focus=Comments-27-9693637.0-0 --- library/build.gradle.kts | 4 ++-- samples/multiplatform-kotlin/shared/build.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 1662278c..3aa263fe 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -11,11 +11,11 @@ kotlin { macosX64(), macosArm64(), iosX64(), - iosArm64(), +// iosArm64(), iosSimulatorArm64(), tvosSimulatorArm64(), tvosX64(), - tvosArm64(), +// tvosArm64(), ).forEach { it.binaries.framework { baseName = project.name diff --git a/samples/multiplatform-kotlin/shared/build.gradle.kts b/samples/multiplatform-kotlin/shared/build.gradle.kts index 6aeec218..4a822569 100644 --- a/samples/multiplatform-kotlin/shared/build.gradle.kts +++ b/samples/multiplatform-kotlin/shared/build.gradle.kts @@ -9,7 +9,7 @@ kotlin { macosX64(), macosArm64(), iosX64(), - iosArm64(), +// iosArm64(), iosSimulatorArm64(), ).forEach { it.binaries.framework { From a58a4510a287da2cfdb2d7f128d9c4ecdfb46274 Mon Sep 17 00:00:00 2001 From: Jorge Antonio Diaz-Benito Soriano Date: Tue, 9 Apr 2024 16:54:43 +0200 Subject: [PATCH 2/4] macos-13 runner -> macos-14-xlarge --- .github/workflows/build.yml | 2 +- .github/workflows/dependencyReport.yml | 2 +- .github/workflows/staticAnalysis.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f8c084c8..4b44f0bc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Build on: push jobs: root: - runs-on: macos-13 + runs-on: macos-14-xlarge steps: - uses: actions/checkout@v3.5.3 - uses: ./.github/actions/runGradleTask diff --git a/.github/workflows/dependencyReport.yml b/.github/workflows/dependencyReport.yml index 254924d5..18d8be25 100644 --- a/.github/workflows/dependencyReport.yml +++ b/.github/workflows/dependencyReport.yml @@ -7,7 +7,7 @@ permissions: contents: write jobs: library: - runs-on: macos-13 + runs-on: macos-14-xlarge steps: - uses: actions/checkout@v3.5.3 - uses: actions/setup-java@v3.9.0 diff --git a/.github/workflows/staticAnalysis.yml b/.github/workflows/staticAnalysis.yml index 0549175d..ab11fc61 100644 --- a/.github/workflows/staticAnalysis.yml +++ b/.github/workflows/staticAnalysis.yml @@ -7,7 +7,7 @@ jobs: - uses: actions/checkout@v3.5.3 - run: .scripts/check_ktlint.sh codeql: - runs-on: macos-13 + runs-on: macos-14-xlarge permissions: actions: read contents: read From af75726dd9842df18757d4e432bc28aaa1d81cb2 Mon Sep 17 00:00:00 2001 From: Jorge Antonio Diaz-Benito Soriano Date: Tue, 9 Apr 2024 17:24:55 +0200 Subject: [PATCH 3/4] Remove log calls --- .../internal/NTPUDPSocketOperations.kt | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt b/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt index 7c6fd712..86e30287 100644 --- a/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt +++ b/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt @@ -37,36 +37,24 @@ internal actual class NTPUDPSocketOperations { private var connection: nw_connection_t = null actual suspend fun prepare(address: String, portNumber: Int, connectTimeout: Duration) { - println("BEFORE CREATESECUREUDP") val parameters = nw_parameters_create_secure_udp_disable_protocol() - println("BEFORE CREATEHOST") - println("Endpoint is $address/$portNumber") val endpoint = nw_endpoint_create_host(address, portNumber.toString()) - println("BEFORE CONNCREATE") connection = nw_connection_create(endpoint, parameters) - println("BEFORE SETQUEUE") nw_connection_set_queue(connection, dispatch_get_current_queue()) val connectionStateDeferred = CompletableDeferred() - println("BEFORE SETHANDLER") nw_connection_set_state_changed_handler(connection) { state: nw_connection_state_t, _ -> - println("State is $state") when (state) { nw_connection_state_ready, nw_connection_state_failed, nw_connection_state_cancelled -> connectionStateDeferred.complete(state) } } - println("Print test") - println("BEFORE START") nw_connection_start(connection) - println("BEFORE WITHTIMEOUT") withTimeout(connectTimeout) { assertEquals(nw_connection_state_ready, connectionStateDeferred.await()) } - println("AFTER WITHTIMEOUT") } actual suspend fun exchange(buffer: ByteArray, readTimeout: Duration) { - println("EXCHANGE") val data = buffer.pin().run { dispatch_data_create( addressOf(0), @@ -75,31 +63,25 @@ internal actual class NTPUDPSocketOperations { ({ unpin() }), ) } - println("BEFORE SEND") nw_connection_send_default_context( connection, data, true, ) { - println("SEND CB, ERROR IS $it") assertNull(it) } val connectionReceptionDeferred = CompletableDeferred() - println("BEFORE RECEIVE") nw_connection_receive( connection, 1.convert(), buffer.size.convert(), ) { content: dispatch_data_t, _, _, error: nw_error_t -> - println("RECEIVE CB, ERROR IS $error") assertNull(error) connectionReceptionDeferred.complete(content) } - println("BEFORE RECEIVE TIMEOUT") val receivedData = withTimeout(readTimeout) { connectionReceptionDeferred.await() } - println("BEFORE USEPINNED FOR RECEIVED") buffer.usePinned { dispatch_data_apply(receivedData) { _, offset, src, size -> memcpy(it.addressOf(offset.toInt()), src, size) @@ -109,7 +91,6 @@ internal actual class NTPUDPSocketOperations { } actual fun tearDown() { - println("TEARDOWN") nw_connection_force_cancel(connection) connection = null } From 7c7bbbf384508fba723fe338be2c714ef6449b8e Mon Sep 17 00:00:00 2001 From: Jorge Antonio Diaz-Benito Soriano Date: Tue, 9 Apr 2024 17:29:36 +0200 Subject: [PATCH 4/4] Extract timeout logic to common --- .../networktime/internal/NTPUDPSocketOperations.kt | 14 ++++---------- .../networktime/internal/NTPExchangeCoordinator.kt | 9 +++++++-- .../networktime/internal/NTPUDPSocketOperations.kt | 6 ++---- .../networktime/internal/NTPUDPSocketOperations.kt | 12 +++--------- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt b/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt index 86e30287..5324b949 100644 --- a/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt +++ b/library/src/appleMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt @@ -8,7 +8,6 @@ import kotlinx.cinterop.convert import kotlinx.cinterop.pin import kotlinx.cinterop.usePinned import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.withTimeout import platform.Network.nw_connection_create import platform.Network.nw_connection_force_cancel import platform.Network.nw_connection_receive @@ -29,14 +28,13 @@ import platform.darwin.dispatch_get_current_queue import platform.posix.memcpy import kotlin.test.assertEquals import kotlin.test.assertNull -import kotlin.time.Duration @OptIn(ExperimentalForeignApi::class) @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") internal actual class NTPUDPSocketOperations { private var connection: nw_connection_t = null - actual suspend fun prepare(address: String, portNumber: Int, connectTimeout: Duration) { + actual suspend fun prepare(address: String, portNumber: Int) { val parameters = nw_parameters_create_secure_udp_disable_protocol() val endpoint = nw_endpoint_create_host(address, portNumber.toString()) connection = nw_connection_create(endpoint, parameters) @@ -49,12 +47,10 @@ internal actual class NTPUDPSocketOperations { } } nw_connection_start(connection) - withTimeout(connectTimeout) { - assertEquals(nw_connection_state_ready, connectionStateDeferred.await()) - } + assertEquals(nw_connection_state_ready, connectionStateDeferred.await()) } - actual suspend fun exchange(buffer: ByteArray, readTimeout: Duration) { + actual suspend fun exchange(buffer: ByteArray) { val data = buffer.pin().run { dispatch_data_create( addressOf(0), @@ -79,9 +75,7 @@ internal actual class NTPUDPSocketOperations { assertNull(error) connectionReceptionDeferred.complete(content) } - val receivedData = withTimeout(readTimeout) { - connectionReceptionDeferred.await() - } + val receivedData = connectionReceptionDeferred.await() buffer.usePinned { dispatch_data_apply(receivedData) { _, offset, src, size -> memcpy(it.addressOf(offset.toInt()), src, size) diff --git a/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPExchangeCoordinator.kt b/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPExchangeCoordinator.kt index 89d29d0c..3ae17bc8 100644 --- a/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPExchangeCoordinator.kt +++ b/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPExchangeCoordinator.kt @@ -1,5 +1,6 @@ package com.tidal.networktime.internal +import kotlinx.coroutines.withTimeout import kotlin.time.Duration internal class NTPExchangeCoordinator( @@ -15,12 +16,16 @@ internal class NTPExchangeCoordinator( ): NTPExchangeResult? { val ntpUdpSocketOperations = NTPUDPSocketOperations() return try { - ntpUdpSocketOperations.prepare(address, NTP_PORT_NUMBER, connectTimeout) + withTimeout(connectTimeout) { + ntpUdpSocketOperations.prepare(address, NTP_PORT_NUMBER) + } val ntpPacket = NTPPacket(versionNumber = ntpVersion.toInt(), mode = NTP_MODE_CLIENT) val requestTime = referenceClock.referenceEpochTime ntpPacket.transmitEpochTimestamp = EpochTimestamp(requestTime).asNTPTimestamp val buffer = ntpPacketSerializer(ntpPacket) - ntpUdpSocketOperations.exchange(buffer, queryReadTimeout) + withTimeout(queryReadTimeout) { + ntpUdpSocketOperations.exchange(buffer) + } val returnTime = referenceClock.referenceEpochTime ntpPacketDeserializer(buffer)?.let { NTPExchangeResult(returnTime, it) } } catch (_: Throwable) { diff --git a/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt b/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt index 49d1df4c..dca57282 100644 --- a/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt +++ b/library/src/commonMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt @@ -1,12 +1,10 @@ package com.tidal.networktime.internal -import kotlin.time.Duration - @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") internal expect class NTPUDPSocketOperations() { - suspend fun prepare(address: String, portNumber: Int, connectTimeout: Duration) + suspend fun prepare(address: String, portNumber: Int) - suspend fun exchange(buffer: ByteArray, readTimeout: Duration) + suspend fun exchange(buffer: ByteArray) fun tearDown() } diff --git a/library/src/jvmMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt b/library/src/jvmMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt index 8874155f..3ba6aeab 100644 --- a/library/src/jvmMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt +++ b/library/src/jvmMain/kotlin/com/tidal/networktime/internal/NTPUDPSocketOperations.kt @@ -1,27 +1,21 @@ package com.tidal.networktime.internal -import kotlinx.coroutines.withTimeout import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetAddress -import kotlin.time.Duration -import kotlin.time.DurationUnit @Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING", "BlockingMethodInNonBlockingContext") internal actual class NTPUDPSocketOperations { private var datagramSocket: DatagramSocket? = null - actual suspend fun prepare(address: String, portNumber: Int, connectTimeout: Duration) { + actual suspend fun prepare(address: String, portNumber: Int) { datagramSocket = DatagramSocket() - withTimeout(connectTimeout) { - datagramSocket!!.connect(InetAddress.getByName(address), portNumber) - } + datagramSocket!!.connect(InetAddress.getByName(address), portNumber) } - actual suspend fun exchange(buffer: ByteArray, readTimeout: Duration) { + actual suspend fun exchange(buffer: ByteArray) { val exchangePacket = DatagramPacket(buffer, buffer.size) datagramSocket!!.send(exchangePacket) - datagramSocket!!.soTimeout = readTimeout.toInt(DurationUnit.MILLISECONDS) datagramSocket!!.receive(exchangePacket) }