diff options
author | Patrik Nyblom <[email protected]> | 2012-06-12 18:45:45 +0200 |
---|---|---|
committer | Patrik Nyblom <[email protected]> | 2012-06-13 16:45:50 +0200 |
commit | 70b17a5ccb8204df1fbbf04d8232492267dd7533 (patch) | |
tree | 6d258ac2f0d96d7f9f5f3ecf6e5b5ef5115e6ee9 /erts/etc/common/heart.c | |
parent | b16baad540d35b890c0c6baf9a1be2a90ea96239 (diff) | |
download | otp-70b17a5ccb8204df1fbbf04d8232492267dd7533.tar.gz otp-70b17a5ccb8204df1fbbf04d8232492267dd7533.tar.bz2 otp-70b17a5ccb8204df1fbbf04d8232492267dd7533.zip |
Make heart use clock_gettime when available
Diffstat (limited to 'erts/etc/common/heart.c')
-rw-r--r-- | erts/etc/common/heart.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/erts/etc/common/heart.c b/erts/etc/common/heart.c index 4f738947b7..c1f6551d21 100644 --- a/erts/etc/common/heart.c +++ b/erts/etc/common/heart.c @@ -102,9 +102,6 @@ * that can simulate gethrtime with clock_gettime, no use implementing * a phony gethrtime in this file as the time questions are so infrequent. */ -#if defined(CORRET_USING_TIMES) || defined(GETHRTIME_WITH_CLOCK_GETTIME) -# define HEART_CORRECT_USING_TIMES 1 -#endif #include <stdio.h> #include <stddef.h> @@ -134,7 +131,7 @@ # include <sys/time.h> # include <unistd.h> # include <signal.h> -# if defined(HEART_CORRECT_USING_TIMES) +# if defined(CORRECT_USING_TIMES) # include <sys/times.h> # include <limits.h> # endif @@ -446,7 +443,8 @@ message_loop(erlin_fd, erlout_fd) */ timestamp(&now); if (now > last_received + heart_beat_timeout) { - print_error("heart-beat time-out."); + print_error("heart-beat time-out, no activity for %lu seconds", + (unsigned long) (now - last_received)); return R_TIMEOUT; } /* @@ -1072,7 +1070,31 @@ time_t timestamp(time_t *res) return r; } -#elif defined(HAVE_GETHRTIME) +#elif defined(HAVE_GETHRTIME) || defined(GETHRTIME_WITH_CLOCK_GETTIME) + +#if defined(GETHRTIME_WITH_CLOCK_GETTIME) +typedef long long SysHrTime; + +SysHrTime sys_gethrtime(void); + +SysHrTime sys_gethrtime(void) +{ + struct timespec ts; + long long result; + if (clock_gettime(CLOCK_MONOTONIC,&ts) != 0) { + print_error("Fatal, could not get clock_monotonic value, terminating! " + "errno = %d\n", errno); + exit(1); + } + result = ((long long) ts.tv_sec) * 1000000000LL + + ((long long) ts.tv_nsec); + return (SysHrTime) result; +} +#else +typedef hrtime_t SysHrTime; +#define sys_gethrtime() gethrtime() +#endif + void init_timestamp(void) { @@ -1080,14 +1102,14 @@ void init_timestamp(void) time_t timestamp(time_t *res) { - hrtime_t ht = gethrtime(); + SysHrTime ht = sys_gethrtime(); time_t r = (time_t) (ht / 1000000000); if (res != NULL) *res = r; return r; } -#elif defined(HEART_CORRECT_USING_TIMES) +#elif defined(CORRECT_USING_TIMES) # ifdef NO_SYSCONF # include <sys/param.h> |