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