master
h 42 lines 2.21 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef LIBNETDATA_OS_TIMESTAMPS_H
4 #define LIBNETDATA_OS_TIMESTAMPS_H
5
6 // Windows file time starts on January 1, 1601, Unix epoch starts on January 1, 1970
7 // Difference in 100-nanosecond intervals between these two dates is 116444736000000000ULL
8
9 // Convert Windows file time (in 100-nanosecond intervals) to Unix epoch in nanoseconds
10 #define os_windows_ulonglong_to_unix_epoch_ns(ft) (((uint64_t)(ft) - 116444736000000000ULL) * 100ULL)
11
12 // Convert Unix epoch time (in nanoseconds) to Windows file time (in 100-nanosecond intervals)
13 #define os_unix_epoch_ns_to_windows_ulonglong(ns) (((uint64_t)(ns) / 100ULL) + 116444736000000000ULL)
14
15 #if defined(OS_WINDOWS)
16 // Convert FILETIME to Unix epoch in nanoseconds
17 #define os_filetime_to_unix_epoch_ns(ft) \
18 ((((uint64_t)(ft).dwHighDateTime << 32 | (ft).dwLowDateTime) - 116444736000000000ULL) * 100ULL)
19
20 // Convert Unix epoch in nanoseconds to FILETIME (returns FILETIME)
21 #define os_unix_epoch_ns_to_filetime(ns) \
22 ({ \
23 uint64_t temp = ((uint64_t)(ns) / 100ULL) + 116444736000000000ULL; \
24 FILETIME ft; \
25 ft.dwLowDateTime = (uint32_t)(temp & 0xFFFFFFFF); \
26 ft.dwHighDateTime = (uint32_t)(temp >> 32); \
27 ft; \
28 })
29
30 // Convert Unix epoch in microseconds to FILETIME (returns FILETIME)
31 #define os_unix_epoch_ut_to_filetime(ns) \
32 ({ \
33 uint64_t temp = ((uint64_t)(ns) * 10ULL) + 116444736000000000ULL; \
34 FILETIME ft; \
35 ft.dwLowDateTime = (uint32_t)(temp & 0xFFFFFFFF); \
36 ft.dwHighDateTime = (uint32_t)(temp >> 32); \
37 ft; \
38 })
39
40 #endif //OS_WINDOWS
41
42 #endif //LIBNETDATA_OS_TIMESTAMPS_H