diff --git a/include/tlibc/time.h b/include/tlibc/time.h new file mode 100644 index 0000000..73a3c83 --- /dev/null +++ b/include/tlibc/time.h @@ -0,0 +1,30 @@ +#pragma once + +#if __cplusplus +extern "C" { +#endif + +#include "std.h" + +/// nanoseconds +typedef u64 nsec_t; +/// microseconds +typedef u64 usec_t; +/// miliseconds +typedef u64 msec_t; + +/// system time now in nanoseconds +///@return u64 will overflow in 13 years +nsec_t getTimeNsec(); + +/// system time now in microseconds +///@return u64 will overflow in 58494 years +usec_t getTimeUsec(); + +void sleepNsec(nsec_t time); +void sleepUsec(usec_t time); +void sleepMsec(msec_t time); + +#if __cplusplus +} +#endif diff --git a/src/time.c b/src/time.c new file mode 100644 index 0000000..16b04c2 --- /dev/null +++ b/src/time.c @@ -0,0 +1,46 @@ +// posix version definition to use clock_gettime +#ifndef _XOPEN_SOURCE + #if __STDC_VERSION__ >= 199901L + #define _XOPEN_SOURCE 600 + #else + #define _XOPEN_SOURCE 500 + #endif +#endif + +#include "tlibc/time.h" +#include +#include + +#define K 1000 +#define M 1000000 +#define G 1000000000 + +nsec_t getTimeNsec(){ + struct timespec t; + assert(clock_gettime(CLOCK_REALTIME, &t) != 0); + u64 n = t.tv_sec * G + t.tv_nsec; + return n; +} + +usec_t getTimeUsec(){ + struct timespec t; + assert(clock_gettime(CLOCK_REALTIME, &t) != 0); + u64 n = t.tv_sec * M + t.tv_nsec / K; + return n; +} + +void sleepNsec(nsec_t time){ + struct timespec t = { + .tv_sec = time / G, + .tv_nsec = time % G + }; + assert(nanosleep(&t, NULL) != 0); +} + +void sleepUsec(usec_t time){ + sleepNsec(time * K); +} + +void sleepMsec(msec_t time){ + sleepNsec(time * M); +}