File: time.c

package info (click to toggle)
wlmaker 0.7%2Bgit20260201%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,292 kB
  • sloc: ansic: 44,505; xml: 467; cpp: 253; yacc: 118; sh: 73; lex: 70; makefile: 8
file content (96 lines) | stat: -rw-r--r-- 3,002 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/* ========================================================================= */
/**
 * @file time.c
 *
 * @copyright
 * Copyright 2023 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/// clock_gettime(2) is a POSIX extension, at 199309L. _XOPEN_SOURCE 500
/// defines _POSIX_C_SOURCE at 199506L.
/// gettimeofday(2) is a XSI extension, needing _XOPEN_SOURCE 500.
#define _XOPEN_SOURCE 500

#include <libbase/log.h>
#include <libbase/test.h>
#include <libbase/time.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/time.h>
#include <time.h>

#undef _XOPEN_SOURCE

/* == Methods ============================================================== */

/* ------------------------------------------------------------------------- */
uint64_t bs_usec(void)
{
    struct timeval tv;
    if (0 != gettimeofday(&tv, NULL)) {
        bs_log(BS_ERROR | BS_ERRNO, "Failed gettimeofday(%p,  NULL)\n",
               (void*)&tv);
        return 0;
    }
    return (uint64_t)tv.tv_sec * UINT64_C(1000000) +
        (uint64_t)tv.tv_usec % UINT64_C(1000000);
}

/* ------------------------------------------------------------------------- */
uint64_t bs_mono_nsec(void)
{
    struct timespec timespec;
    if (0 != clock_gettime(CLOCK_MONOTONIC, &timespec)) {
        bs_log(BS_ERROR | BS_ERRNO,
               "Failed clock_gettime(CLOCK_MONOTONIC, %p)",
               &timespec);
        return 0;
    }

    return timespec.tv_sec * UINT64_C(1000000000) +  + timespec.tv_nsec;
}

/* == Unit tests =========================================================== */

static void bs_time_test_usec(bs_test_t *test_ptr);
static void bs_time_test_nsec(bs_test_t *test_ptr);

/** Unit test cases. */
static const bs_test_case_t   bs_time_test_cases[] = {
    { true, "time usec", bs_time_test_usec },
    { true, "time_mono_nsec", bs_time_test_nsec },
    BS_TEST_CASE_SENTINEL()
};

const bs_test_set_t bs_time_test_set = BS_TEST_SET(
    true, "time", bs_time_test_cases);

/* ------------------------------------------------------------------------- */
void bs_time_test_usec(bs_test_t *test_ptr)
{
    BS_TEST_VERIFY_NEQ(test_ptr, 0, bs_usec());
}

/* ------------------------------------------------------------------------- */
void bs_time_test_nsec(bs_test_t *test_ptr)
{
    uint64_t v1, v2;
    v1 = bs_mono_nsec();
    v2 = bs_mono_nsec();
    BS_TEST_VERIFY_TRUE(test_ptr, v1 <= v2);
}

/* == End of time.c ======================================================== */