#include #include "timestamp.h" // 1 s = 1000 ms // 1 ms = 1000 us // 1 us = 1000 ns struct timestamp { struct timespec ts; uint64_t ts_in_msec; uint64_t ts_in_sec; } g_timestamp; #define ATOMIC_SET(x, y) __atomic_store_n(x, y, __ATOMIC_RELAXED) #define ATOMIC_READ(x) __atomic_load_n(x, __ATOMIC_RELAXED) void timestamp_update() { clock_gettime(CLOCK_MONOTONIC, &g_timestamp.ts); uint64_t current_timestamp_ms = g_timestamp.ts.tv_sec * 1000 + g_timestamp.ts.tv_nsec / 1000000; uint64_t current_timestamp_sec = g_timestamp.ts.tv_sec + g_timestamp.ts.tv_nsec / 1000000000; ATOMIC_SET(&g_timestamp.ts_in_msec, current_timestamp_ms); ATOMIC_SET(&g_timestamp.ts_in_sec, current_timestamp_sec); } uint64_t timestamp_get_sec() { return ATOMIC_READ(&g_timestamp.ts_in_sec); } uint64_t timestamp_get_msec() { return ATOMIC_READ(&g_timestamp.ts_in_msec); }