From 6e3057ddddb77835664f5264a7da62452dc3d9c1 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang-solutions.com>
Date: Thu, 11 Sep 2014 18:26:00 +0200
Subject: erts: Allow cpu_timestamp tracing for Linux

---
 erts/aclocal.m4                       | 38 ++++++++++++++---------------------
 erts/doc/src/erlang.xml               |  4 +++-
 erts/emulator/beam/erl_bif_trace.c    |  4 ++--
 erts/emulator/beam/erl_time.h         |  2 +-
 erts/emulator/sys/unix/erl_unix_sys.h |  4 ++--
 5 files changed, 23 insertions(+), 29 deletions(-)

(limited to 'erts')

diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
index d78025b0be..63f5a9c840 100644
--- a/erts/aclocal.m4
+++ b/erts/aclocal.m4
@@ -1881,38 +1881,30 @@ case $erl_gethrvtime in
 	    exit(0); return 0;
 	  }
 	],
-	erl_clock_gettime=yes,
-	erl_clock_gettime=no,
+	erl_clock_gettime_cpu_time=yes,
+	erl_clock_gettime_cpu_time=no,
 	[
 	case X$erl_xcomp_clock_gettime_cpu_time in
-	    X) erl_clock_gettime=cross;;
-	    Xyes|Xno) erl_clock_gettime=$erl_xcomp_clock_gettime_cpu_time;;
+	    X) erl_clock_gettime_cpu_time=cross;;
+	    Xyes|Xno) erl_clock_gettime_cpu_time=$erl_xcomp_clock_gettime_cpu_time;;
 	    *) AC_MSG_ERROR([Bad erl_xcomp_clock_gettime_cpu_time value: $erl_xcomp_clock_gettime_cpu_time]);;
 	esac
 	])
 	LIBS=$save_libs
-	case $host_os in
-		linux*)
-			AC_MSG_RESULT([no; not stable])
+	AC_MSG_RESULT($erl_clock_gettime_cpu_time)
+	case $erl_clock_gettime_cpu_time in
+		yes)
+			AC_DEFINE(HAVE_CLOCK_GETTIME_CPU_TIME,[],
+				  [define if clock_gettime() works for getting process time])
+			LIBRT=-lrt
+			;;
+		cross)
+			erl_clock_gettime_cpu_time=no
+			AC_MSG_WARN([result no guessed because of cross compilation])
 			LIBRT=$xrtlib
 			;;
 		*)
-			AC_MSG_RESULT($erl_clock_gettime)
-			case $erl_clock_gettime in
-	  			yes)
-					AC_DEFINE(HAVE_CLOCK_GETTIME,[],
-						  [define if clock_gettime() works for getting process time])
-					LIBRT=-lrt
-					;;
-	  			cross)
-					erl_clock_gettime=no
-					AC_MSG_WARN([result no guessed because of cross compilation])
-					LIBRT=$xrtlib
-					;;
-	  			*)
-					LIBRT=$xrtlib
-					;;
-			esac
+			LIBRT=$xrtlib
 			;;
 	esac
 	AC_SUBST(LIBRT)
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index f9e8717847..37431cbf1b 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -6829,7 +6829,9 @@ ok
               only allowed with <c>PidSpec==all</c>. If the host
               machine operating system does not support high resolution
               CPU time measurements, <c>trace/3</c> exits with
-              <c>badarg</c>.</p>
+              <c>badarg</c>. Note that most operating systems do
+              not synchronize this value across cores, so be prepared
+              that time might seem to go backwards when using this option.</p>
           </item>
           <tag><c>arity</c></tag>
           <item>
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c
index 06fbbea123..f5e582b1c5 100644
--- a/erts/emulator/beam/erl_bif_trace.c
+++ b/erts/emulator/beam/erl_bif_trace.c
@@ -651,7 +651,7 @@ Eterm trace_3(BIF_ALIST_3)
 	    if (pid_spec == am_all) {
 		if (on) {
 		    if (!erts_cpu_timestamp) {
-#ifdef HAVE_CLOCK_GETTIME
+#ifdef HAVE_CLOCK_GETTIME_CPU_TIME
 			/* 
 			   Perhaps clock_gettime was found during config
 			   on a different machine than this. We check
@@ -678,7 +678,7 @@ Eterm trace_3(BIF_ALIST_3)
 			if (erts_start_now_cpu() < 0) {
 			    goto error;
 			}
-#endif /* HAVE_CLOCK_GETTIME */
+#endif /* HAVE_CLOCK_GETTIME_CPU_TIME */
 			erts_cpu_timestamp = !0;
 		    }
 		}
diff --git a/erts/emulator/beam/erl_time.h b/erts/emulator/beam/erl_time.h
index 4bbdcaa3e3..7ed1a395ad 100644
--- a/erts/emulator/beam/erl_time.h
+++ b/erts/emulator/beam/erl_time.h
@@ -107,7 +107,7 @@ ERTS_GLB_INLINE void erts_do_time_add(erts_short_time_t elapsed)
 
 /* time_sup */
 
-#if (defined(HAVE_GETHRVTIME) || defined(HAVE_CLOCK_GETTIME))
+#if (defined(HAVE_GETHRVTIME) || defined(HAVE_CLOCK_GETTIME_CPU_TIME))
 #  ifndef HAVE_ERTS_NOW_CPU
 #    define HAVE_ERTS_NOW_CPU
 #    ifdef HAVE_GETHRVTIME
diff --git a/erts/emulator/sys/unix/erl_unix_sys.h b/erts/emulator/sys/unix/erl_unix_sys.h
index 26ed2fb558..b6bca5c0f4 100644
--- a/erts/emulator/sys/unix/erl_unix_sys.h
+++ b/erts/emulator/sys/unix/erl_unix_sys.h
@@ -188,7 +188,7 @@ typedef hrtime_t SysHrTime;
 #endif /* GETHRTIME_WITH_CLOCK_GETTIME */
 #endif /* HAVE_GETHRTIME */
 
-#if (defined(HAVE_GETHRVTIME) || defined(HAVE_CLOCK_GETTIME))
+#if (defined(HAVE_GETHRVTIME) || defined(HAVE_CLOCK_GETTIME_CPU_TIME))
 typedef long long SysCpuTime;
 typedef struct timespec SysTimespec;
 
@@ -200,7 +200,7 @@ typedef struct timespec SysTimespec;
 int sys_start_hrvtime(void);
 int sys_stop_hrvtime(void);
 
-#elif defined(HAVE_CLOCK_GETTIME)
+#elif defined(HAVE_CLOCK_GETTIME_CPU_TIME)
 #define sys_clock_gettime(cid,tp) clock_gettime((cid),&(tp))
 #define sys_get_proc_cputime(t,tp) sys_clock_gettime(CLOCK_PROCESS_CPUTIME_ID,(tp))
 
-- 
cgit v1.2.3