From 70b17a5ccb8204df1fbbf04d8232492267dd7533 Mon Sep 17 00:00:00 2001 From: Patrik Nyblom Date: Tue, 12 Jun 2012 18:45:45 +0200 Subject: Make heart use clock_gettime when available --- erts/etc/common/Makefile.in | 5 ++++- erts/etc/common/heart.c | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/erts/etc/common/Makefile.in b/erts/etc/common/Makefile.in index 3db4fcba61..20c4c3c2b1 100644 --- a/erts/etc/common/Makefile.in +++ b/erts/etc/common/Makefile.in @@ -61,6 +61,9 @@ LD = @LD@ LIBS = @LIBS@ LDFLAGS = @LDFLAGS@ +# For clock_gettime in heart +RTLIBS = @LIBRT@ + ifeq ($(TARGET),win32) ifeq ($(TYPE),debug) CFLAGS = $(subst -O2,-g,@CFLAGS@ @DEFS@ $(TYPE_FLAGS) @WFLAGS@ -I$(SYSDIR) \ @@ -459,7 +462,7 @@ else $(BINDIR)/heart@EXEEXT@: $(OBJDIR)/heart.o $(ENTRY_OBJ) $(LD) $(LDFLAGS) $(ENTRY_LDFLAGS) -o $@ $(OBJDIR)/heart.o \ - $(ENTRY_OBJ) $(WINDSOCK) + $(RTLIBS) $(ENTRY_OBJ) $(WINDSOCK) $(OBJDIR)/heart.o: heart.c $(CC) $(CFLAGS) -o $@ -c heart.c 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 #include @@ -134,7 +131,7 @@ # include # include # include -# if defined(HEART_CORRECT_USING_TIMES) +# if defined(CORRECT_USING_TIMES) # include # include # 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 -- cgit v1.2.3