1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 2007 Denis Vlasenko
6 *
7 * Licensed under GPL version 2, see file LICENSE in this tarball for details.
8 */
9
10#include "libbb.h"
11
12#if ENABLE_MONOTONIC_SYSCALL
13#include <sys/syscall.h>
14
15/* libc has incredibly messy way of doing this,
16 * typically requiring -lrt. We just skip all this mess */
17unsigned long long monotonic_us(void)
18{
19	struct timespec ts;
20	if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts))
21		bb_error_msg_and_die("clock_gettime(MONOTONIC) failed");
22	return ts.tv_sec * 1000000ULL + ts.tv_nsec/1000;
23}
24unsigned monotonic_sec(void)
25{
26	struct timespec ts;
27	if (syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &ts))
28		bb_error_msg_and_die("clock_gettime(MONOTONIC) failed");
29	return ts.tv_sec;
30}
31#else
32unsigned long long monotonic_us(void)
33{
34	struct timeval tv;
35	gettimeofday(&tv, NULL);
36	return tv.tv_sec * 1000000ULL + tv.tv_usec;
37}
38
39unsigned monotonic_sec(void)
40{
41	return time(NULL);
42}
43#endif
44