From: Willy Tarreau Date: Wed, 29 Apr 2015 15:13:35 +0000 (+0200) Subject: MINOR: tools: provide an rdtsc() function for time comparisons X-Git-Tag: v1.6-dev2~177 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e6e49cfa93acc7b222f5395a049c8de53a6eb5df;p=thirdparty%2Fhaproxy.git MINOR: tools: provide an rdtsc() function for time comparisons This one returns a timestamp, either the one from the CPU or from gettimeofday() in 64-bit format. The purpose is to be able to compare timestamps on various entities to make it easier to detect updates. It can also be used for benchmarking in certain situations during development. --- diff --git a/include/common/standard.h b/include/common/standard.h index d0d5065dfa..bb63535f72 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -959,4 +960,23 @@ static inline unsigned char utf8_return_length(unsigned char code) return code & 0x0f; } +/* returns a 64-bit a timestamp with the finest resolution available. The + * unit is intentionally not specified. It's mostly used to compare dates. + */ +#if defined(__i386__) || defined(__x86_64__) +static inline unsigned long long rdtsc() +{ + unsigned int a, d; + asm volatile("rdtsc" : "=a" (a), "=d" (d)); + return a + ((unsigned long long)d << 32); +} +#else +static inline unsigned long long rdtsc() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * 1000000 + tv.tv_usec; +} +#endif + #endif /* _COMMON_STANDARD_H */