xref: /dflybsd-src/contrib/zstd/programs/timefn.h (revision a28cd43d19e8b720a6c852a4bbc5ae147a26165a)
1a28cd43dSSascha Wildner /*
2a28cd43dSSascha Wildner  * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
3a28cd43dSSascha Wildner  * All rights reserved.
4a28cd43dSSascha Wildner  *
5a28cd43dSSascha Wildner  * This source code is licensed under both the BSD-style license (found in the
6a28cd43dSSascha Wildner  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7a28cd43dSSascha Wildner  * in the COPYING file in the root directory of this source tree).
8a28cd43dSSascha Wildner  * You may select, at your option, one of the above-listed licenses.
9a28cd43dSSascha Wildner  */
10a28cd43dSSascha Wildner 
11a28cd43dSSascha Wildner #ifndef TIME_FN_H_MODULE_287987
12a28cd43dSSascha Wildner #define TIME_FN_H_MODULE_287987
13a28cd43dSSascha Wildner 
14a28cd43dSSascha Wildner #if defined (__cplusplus)
15a28cd43dSSascha Wildner extern "C" {
16a28cd43dSSascha Wildner #endif
17a28cd43dSSascha Wildner 
18a28cd43dSSascha Wildner 
19a28cd43dSSascha Wildner /*-****************************************
20a28cd43dSSascha Wildner *  Dependencies
21a28cd43dSSascha Wildner ******************************************/
22a28cd43dSSascha Wildner #include <time.h>         /* clock_t, clock, CLOCKS_PER_SEC */
23a28cd43dSSascha Wildner 
24a28cd43dSSascha Wildner 
25a28cd43dSSascha Wildner 
26a28cd43dSSascha Wildner /*-****************************************
27a28cd43dSSascha Wildner *  Local Types
28a28cd43dSSascha Wildner ******************************************/
29a28cd43dSSascha Wildner 
30a28cd43dSSascha Wildner #if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
31a28cd43dSSascha Wildner # if defined(_AIX)
32a28cd43dSSascha Wildner #  include <inttypes.h>
33a28cd43dSSascha Wildner # else
34a28cd43dSSascha Wildner #  include <stdint.h> /* intptr_t */
35a28cd43dSSascha Wildner # endif
36a28cd43dSSascha Wildner   typedef uint64_t           PTime;  /* Precise Time */
37a28cd43dSSascha Wildner #else
38a28cd43dSSascha Wildner   typedef unsigned long long PTime;  /* does not support compilers without long long support */
39a28cd43dSSascha Wildner #endif
40a28cd43dSSascha Wildner 
41a28cd43dSSascha Wildner 
42a28cd43dSSascha Wildner 
43a28cd43dSSascha Wildner /*-****************************************
44a28cd43dSSascha Wildner *  Time functions
45a28cd43dSSascha Wildner ******************************************/
46a28cd43dSSascha Wildner #if defined(_WIN32)   /* Windows */
47a28cd43dSSascha Wildner 
48a28cd43dSSascha Wildner     #include <windows.h>   /* LARGE_INTEGER */
49a28cd43dSSascha Wildner     typedef LARGE_INTEGER UTIL_time_t;
50a28cd43dSSascha Wildner     #define UTIL_TIME_INITIALIZER { { 0, 0 } }
51a28cd43dSSascha Wildner 
52a28cd43dSSascha Wildner #elif defined(__APPLE__) && defined(__MACH__)
53a28cd43dSSascha Wildner 
54a28cd43dSSascha Wildner     #include <mach/mach_time.h>
55a28cd43dSSascha Wildner     typedef PTime UTIL_time_t;
56a28cd43dSSascha Wildner     #define UTIL_TIME_INITIALIZER 0
57a28cd43dSSascha Wildner 
58a28cd43dSSascha Wildner /* C11 requires timespec_get, but FreeBSD 11 lacks it, while still claiming C11 compliance.
59a28cd43dSSascha Wildner    Android also lacks it but does define TIME_UTC. */
60a28cd43dSSascha Wildner #elif (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */) \
61a28cd43dSSascha Wildner     && defined(TIME_UTC) && !defined(__ANDROID__)
62a28cd43dSSascha Wildner 
63a28cd43dSSascha Wildner     typedef struct timespec UTIL_time_t;
64a28cd43dSSascha Wildner     #define UTIL_TIME_INITIALIZER { 0, 0 }
65a28cd43dSSascha Wildner 
66a28cd43dSSascha Wildner #else   /* relies on standard C90 (note : clock_t measurements can be wrong when using multi-threading) */
67a28cd43dSSascha Wildner 
68a28cd43dSSascha Wildner     typedef clock_t UTIL_time_t;
69a28cd43dSSascha Wildner     #define UTIL_TIME_INITIALIZER 0
70a28cd43dSSascha Wildner 
71a28cd43dSSascha Wildner #endif
72a28cd43dSSascha Wildner 
73a28cd43dSSascha Wildner 
74a28cd43dSSascha Wildner UTIL_time_t UTIL_getTime(void);
75a28cd43dSSascha Wildner PTime UTIL_getSpanTimeMicro(UTIL_time_t clockStart, UTIL_time_t clockEnd);
76a28cd43dSSascha Wildner PTime UTIL_getSpanTimeNano(UTIL_time_t clockStart, UTIL_time_t clockEnd);
77a28cd43dSSascha Wildner 
78a28cd43dSSascha Wildner #define SEC_TO_MICRO ((PTime)1000000)
79a28cd43dSSascha Wildner PTime UTIL_clockSpanMicro(UTIL_time_t clockStart);
80a28cd43dSSascha Wildner PTime UTIL_clockSpanNano(UTIL_time_t clockStart);
81a28cd43dSSascha Wildner 
82a28cd43dSSascha Wildner void UTIL_waitForNextTick(void);
83a28cd43dSSascha Wildner 
84a28cd43dSSascha Wildner 
85a28cd43dSSascha Wildner #if defined (__cplusplus)
86a28cd43dSSascha Wildner }
87a28cd43dSSascha Wildner #endif
88a28cd43dSSascha Wildner 
89a28cd43dSSascha Wildner #endif /* TIME_FN_H_MODULE_287987 */
90