clock abstraction

This commit is contained in:
Nils O. Selåsdal
2013-03-02 17:23:49 +01:00
parent 3f6193914f
commit aaae376d13
2 changed files with 180 additions and 0 deletions
+81
View File
@@ -0,0 +1,81 @@
#include <ucore/ucore_clock.h>
#include <ucore/ucore_utils.h>
#ifdef __GNUC__
#define UNUSED __attribute__((__unused__))
#else
#define UNUSED
#endif
static void ucore_timeofday_now(struct ucore_clock *clock UNUSED, struct timeval *tv)
{
gettimeofday(tv, NULL);
}
static void ucore_time_now(struct ucore_clock *clock UNUSED, struct timeval *tv)
{
tv->tv_sec = time(NULL);
tv->tv_usec = 0;
}
struct ucore_clock ucore_timeofday_clock = {
.name = "gettimeofday",
.now = ucore_timeofday_now,
};
struct ucore_clock ucore_time_clock = {
.name = "time",
.now = ucore_time_now,
};
static void ucore_cached_clock_now(struct ucore_clock *clock UNUSED,
struct timeval *tv)
{
struct ucore_cached_clock *cached_clock;
cached_clock = CONTAINER_OF(clock, struct ucore_cached_clock, clock),
*tv = cached_clock->cache;
}
void ucore_cached_clock_init(struct ucore_cached_clock *clock, struct ucore_clock *real_clock)
{
clock->clock.name = "cached clock";
clock->clock.now = ucore_cached_clock_now;
clock->real_clock = real_clock;
ucore_cached_clock_update(clock);
}
void ucore_cached_clock_update(struct ucore_cached_clock *clock)
{
clock->real_clock->now(&clock->clock, &clock->cache);
}
static void ucore_settable_clock_now(struct ucore_clock *clock, struct timeval *tv)
{
struct ucore_settable_clock *cached_clock;
cached_clock = CONTAINER_OF(clock, struct ucore_settable_clock, clock),
*tv = cached_clock->now;
}
void ucore_settable_clock_init(struct ucore_settable_clock *clock)
{
clock->clock.name = "settable clock";
clock->clock.now = ucore_settable_clock_now;
clock->now.tv_sec = 0;
clock->now.tv_usec = 0;
}
void ucore_settable_clock_set_tv(struct ucore_settable_clock *clock, const struct timeval *tv)
{
clock->now = *tv;
}
void ucore_settable_clock_set(struct ucore_settable_clock *clock, time_t secs, suseconds_t usecs)
{
clock->now.tv_sec = secs;
clock->now.tv_usec = usecs;
}