49 lines
1.7 KiB
Kotlin
49 lines
1.7 KiB
Kotlin
package korlibs.time.internal
|
|
|
|
import korlibs.time.*
|
|
import kotlinx.cinterop.*
|
|
import platform.posix.gettimeofday
|
|
import platform.posix.localtime_r
|
|
import platform.posix.time_tVar
|
|
import platform.posix.timeval
|
|
import platform.posix.tm
|
|
|
|
@OptIn(ExperimentalForeignApi::class)
|
|
internal actual object KlockInternal {
|
|
actual val currentTime: Double get() = memScoped {
|
|
val timeVal = alloc<timeval>()
|
|
gettimeofday(timeVal.ptr, null)
|
|
val sec = timeVal.tv_sec
|
|
val usec = timeVal.tv_usec
|
|
((sec * 1_000L) + (usec / 1_000L)).toDouble()
|
|
}
|
|
|
|
actual val now: TimeSpan get() = memScoped {
|
|
val timeVal = alloc<timeval>()
|
|
gettimeofday(timeVal.ptr, null)
|
|
val sec = timeVal.tv_sec
|
|
val usec = timeVal.tv_usec
|
|
TimeSpan.fromSeconds(sec.toInt()) + TimeSpan.fromMicroseconds(usec.toInt())
|
|
}
|
|
|
|
actual fun sleep(time: TimeSpan) {
|
|
val micros = time.microseconds.toLong()
|
|
val s = micros / 1_000_000
|
|
val u = micros % 1_000_000
|
|
if (s > 0) platform.posix.sleep(s.convert())
|
|
if (u > 0) platform.posix.usleep(u.convert())
|
|
}
|
|
|
|
// @TODO: kotlin-native bug: https://github.com/JetBrains/kotlin-native/pull/1901
|
|
//private val microStart = kotlin.system.getTimeMicros()
|
|
//actual fun currentTimeMillis(): Long = kotlin.system.getTimeMillis()
|
|
//actual fun microClock(): Double = (kotlin.system.getTimeMicros() - microStart).toDouble()
|
|
|
|
actual fun localTimezoneOffsetMinutes(time: DateTime): TimeSpan = memScoped {
|
|
val t = alloc<time_tVar>()
|
|
val tm = alloc<tm>()
|
|
t.value = (time.unixMillisLong / 1000L).convert()
|
|
localtime_r(t.ptr, tm.ptr)
|
|
tm.tm_gmtoff.toInt().seconds
|
|
}
|
|
} |