mu/linux/402time.mu

44 lines
1.1 KiB
Forth

type timespec {
tv_sec: int
tv_nsec: int
}
# return time in seconds since epoch
# TODO: y2038
fn time -> _/eax: int {
var t: timespec
var clock/ebx: int <- copy 0/CLOCK_MONOTONIC
var t-addr/ecx: (addr timespec) <- address t
syscall_clock_gettime
var t-secs-addr/ecx: (addr int) <- get t-addr, tv_sec
var secs/eax: int <- copy *t-secs-addr
return secs
}
# return time in nanoseconds since epoch
fn ntime -> _/eax: int {
var t: timespec
var clock/ebx: int <- copy 0/CLOCK_MONOTONIC
var t-addr/ecx: (addr timespec) <- address t
syscall_clock_gettime
var t-nsecs-addr/ecx: (addr int) <- get t-addr, tv_nsec
var nsecs/eax: int <- copy *t-nsecs-addr
return nsecs
}
# nsecs must be less than 999999999 or 0x3b9ac9ff nanoseconds
fn sleep secs: int, nsecs: int {
var t: timespec
# initialize t
var tmp/eax: (addr int) <- get t, tv_sec
var tmp2/ecx: int <- copy secs
copy-to *tmp, tmp2
tmp <- get t, tv_nsec
tmp2 <- copy nsecs
copy-to *tmp, tmp2
# perform the syscall
var t-addr/ebx: (addr timespec) <- address t
var rem-addr/ecx: (addr timespec) <- copy 0
syscall_nanosleep
}