diff --git a/photon/libc/include/time.h b/photon/libc/include/time.h index e20d30c..53d67fc 100644 --- a/photon/libc/include/time.h +++ b/photon/libc/include/time.h @@ -6,7 +6,9 @@ #include #include -#define CLOCKS_PER_SEC __SYS_CLOCKS_PER_SEC +#define CLOCKS_PER_SEC __SYS_CLOCKS_PER_SEC +#define CLOCK_REALTIME __SYS_CLOCK_REALTIME +#define CLOCK_MONOTONIC __SYS_CLOCK_MONOTONIC struct timespec { time_t tv_sec; @@ -35,4 +37,8 @@ extern size_t strftime(char *str, size_t max, const char *format, const struct t extern void tzset(void); +extern int clock_getres(clockid_t clk_id, struct timespec *res); +extern int clock_gettime(clockid_t clk_id, struct timespec *tp); +extern int clock_settime(clockid_t clk_id, const struct timespec *tp); + #endif diff --git a/photon/libc/sys/horizon/sys/_time.h b/photon/libc/sys/horizon/sys/_time.h index 58f9643..2cfb74c 100644 --- a/photon/libc/sys/horizon/sys/_time.h +++ b/photon/libc/sys/horizon/sys/_time.h @@ -1,11 +1,20 @@ #ifndef SYS_HORIZON___TIME_H_ #define SYS_HORIZON___TIME_H_ -#define __SYS_CLOCKS_PER_SEC 1000000000 +#include +#include -#include +#define __SYS_CLOCKS_PER_SEC 1000000000 +#define __SYS_CLOCK_REALTIME MX_CLOCK_REALTIME +#define __SYS_CLOCK_MONOTONIC MX_CLOCK_MONOTONIC + +struct timespec; extern clock_t __sys_clock(void); extern time_t __sys_time(void); +extern int __sys_clock_getres(clockid_t clk_id, struct timespec *res); +extern int __sys_clock_gettime(clockid_t clk_id, struct timespec *tp); +extern int __sys_clock_settime(clockid_t clk_id, const struct timespec *tp); + #endif diff --git a/photon/libc/sys/horizon/time.c b/photon/libc/sys/horizon/time.c index 984b367..6705b2e 100644 --- a/photon/libc/sys/horizon/time.c +++ b/photon/libc/sys/horizon/time.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -17,3 +18,48 @@ time_t __sys_time(void) return v.sec; } + +int __sys_clock_getres(clockid_t clk_id, struct timespec *res) +{ + mx_time_val_t v; + mx_status_t s = mx_clock_get_resolution(clk_id, &v); + + if (s != MX_OK) { + /* TODO set errno */ + return -1; + } + + res->tv_sec = v.sec; + res->tv_nsec = v.nsec; + + return 0; +} + +int __sys_clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + mx_time_val_t v; + mx_status_t s = mx_clock_get_time(clk_id, &v); + + if (s != MX_OK) { + /* TODO set errno */ + return -1; + } + + tp->tv_sec = v.sec; + tp->tv_nsec = v.nsec; + + return 0; +} + +int __sys_clock_settime(clockid_t clk_id, const struct timespec *tp) +{ + mx_time_val_t v = { .sec = tp->tv_sec, .nsec = tp->tv_nsec }; + mx_status_t s = mx_clock_set_time(clk_id, &v); + + if (s != MX_OK) { + /* TODO set errno */ + return -1; + } + + return 0; +} diff --git a/photon/libc/time/clock.c b/photon/libc/time/clock.c index 65cb9e6..eb4b6ab 100644 --- a/photon/libc/time/clock.c +++ b/photon/libc/time/clock.c @@ -5,3 +5,18 @@ clock_t clock(void) { return __sys_clock(); } + +int clock_getres(clockid_t clk_id, struct timespec *res) +{ + return __sys_clock_getres(clk_id, res); +} + +int clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + return __sys_clock_gettime(clk_id, tp); +} + +int clock_settime(clockid_t clk_id, const struct timespec *tp) +{ + return __sys_clock_settime(clk_id, tp); +}