aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-08-26 08:19:12 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-08-26 08:19:12 -0700
commitf1c76741e8b006964679acdf34e6831e80f39766 (patch)
tree2d47e2eccf4b2509fc9a48a846aab9c738c6ff9b /src/core
parenta96439e02a902ea2656f3b5c9ff03096aba61f2a (diff)
parentbeb580b941af9ee24e770d759f01384c04a5cbd7 (diff)
Merge pull request #3048 from maxwell-demon/timespec
Move core/profiling/timers_preciseclock.h to core/support/ such that we
Diffstat (limited to 'src/core')
-rw-r--r--src/core/profiling/basic_timers.c10
-rw-r--r--src/core/support/time_posix.c14
-rw-r--r--src/core/support/time_precise.h (renamed from src/core/profiling/timers_preciseclock.h)56
-rw-r--r--src/core/support/time_win32.c4
4 files changed, 47 insertions, 37 deletions
diff --git a/src/core/profiling/basic_timers.c b/src/core/profiling/basic_timers.c
index ae37f584eb..4b6a0d2f56 100644
--- a/src/core/profiling/basic_timers.c
+++ b/src/core/profiling/basic_timers.c
@@ -36,7 +36,6 @@
#ifdef GRPC_BASIC_PROFILER
#include "src/core/profiling/timers.h"
-#include "src/core/profiling/timers_preciseclock.h"
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
@@ -53,7 +52,7 @@ typedef enum {
} marker_type;
typedef struct grpc_timer_entry {
- grpc_precise_clock tm;
+ gpr_timespec tm;
int tag;
const char* tagstr;
marker_type type;
@@ -71,9 +70,8 @@ static void log_report() {
int i;
for (i = 0; i < count; i++) {
grpc_timer_entry* entry = &(log[i]);
- printf("GRPC_LAT_PROF " GRPC_PRECISE_CLOCK_FORMAT
- " %p %c %d(%s) %p %s %d\n",
- GRPC_PRECISE_CLOCK_PRINTF_ARGS(&entry->tm),
+ printf("GRPC_LAT_PROF %ld.%09d %p %c %d(%s) %p %s %d\n",
+ entry->tm.tv_sec, entry->tm.tv_nsec,
(void*)(gpr_intptr)gpr_thd_currentid(), entry->type, entry->tag,
entry->tagstr, entry->id, entry->file, entry->line);
}
@@ -93,7 +91,7 @@ static void grpc_timers_log_add(int tag, const char* tagstr, marker_type type,
entry = &log[count++];
- grpc_precise_clock_now(&entry->tm);
+ entry->tm = gpr_now(GPR_CLOCK_PRECISE);
entry->tag = tag;
entry->tagstr = tagstr;
entry->type = type;
diff --git a/src/core/support/time_posix.c b/src/core/support/time_posix.c
index 841485c4b4..a274400243 100644
--- a/src/core/support/time_posix.c
+++ b/src/core/support/time_posix.c
@@ -32,6 +32,7 @@
*/
#include <grpc/support/port_platform.h>
+#include <src/core/support/time_precise.h>
#ifdef GPR_POSIX_TIME
@@ -66,8 +67,14 @@ void gpr_time_init(void) {}
gpr_timespec gpr_now(gpr_clock_type clock) {
struct timespec now;
GPR_ASSERT(clock != GPR_TIMESPAN);
- clock_gettime(clockid_for_gpr_clock[clock], &now);
- return gpr_from_timespec(now, clock);
+ if (clock == GPR_CLOCK_PRECISE) {
+ gpr_timespec ret;
+ gpr_precise_clock_now(&ret);
+ return ret;
+ } else {
+ clock_gettime(clockid_for_gpr_clock[clock], &now);
+ return gpr_from_timespec(now, clock);
+ }
}
#else
/* For some reason Apple's OSes haven't implemented clock_gettime. */
@@ -104,6 +111,9 @@ gpr_timespec gpr_now(gpr_clock_type clock) {
now.tv_sec = now_dbl * 1e-9;
now.tv_nsec = now_dbl - now.tv_sec * 1e9;
break;
+ case GPR_CLOCK_PRECISE:
+ gpr_precise_clock_now(&now);
+ break;
case GPR_TIMESPAN:
abort();
}
diff --git a/src/core/profiling/timers_preciseclock.h b/src/core/support/time_precise.h
index 5c251b47e6..574ebb8448 100644
--- a/src/core/profiling/timers_preciseclock.h
+++ b/src/core/support/time_precise.h
@@ -31,65 +31,63 @@
*
*/
-#ifndef GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H
-#define GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H
+#ifndef GRPC_CORE_SUPPORT_TIME_PRECISE_H_
+#define GRPC_CORE_SUPPORT_TIME_PRECISE_H_
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
#include <stdio.h>
#ifdef GRPC_TIMERS_RDTSC
-typedef long long int grpc_precise_clock;
#if defined(__i386__)
-static void grpc_precise_clock_now(grpc_precise_clock *clk) {
- grpc_precise_clock ret;
+static void gpr_get_cycle_counter(long long int *clk) {
+ long long int ret;
__asm__ volatile("rdtsc" : "=A"(ret));
*clk = ret;
}
// ----------------------------------------------------------------
#elif defined(__x86_64__) || defined(__amd64__)
-static void grpc_precise_clock_now(grpc_precise_clock *clk) {
+static void gpr_get_cycle_counter(long long int *clk) {
unsigned long long low, high;
__asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
*clk = (high << 32) | low;
}
#endif
+
static gpr_once precise_clock_init = GPR_ONCE_INIT;
-static double cycles_per_second = 0.0;
-static void grpc_precise_clock_init() {
+static long long cycles_per_second = 0;
+static void gpr_precise_clock_init() {
time_t start = time(NULL);
- grpc_precise_clock start_time;
- grpc_precise_clock end_time;
+ gpr_precise_clock start_cycle;
+ gpr_precise_clock end_cycle;
while (time(NULL) == start)
;
- grpc_precise_clock_now(&start_time);
+ gpr_get_cycle_counter(&start_cycle);
while (time(NULL) == start + 1)
;
- grpc_precise_clock_now(&end_time);
- cycles_per_second = end_time - start_time;
+ gpr_get_cycle_counter(&end_cycle);
+ cycles_per_second = end_cycle - start_cycle;
}
+
static double grpc_precise_clock_scaling_factor() {
gpr_once_init(&precise_clock_init, grpc_precise_clock_init);
return 1e6 / cycles_per_second;
}
-#define GRPC_PRECISE_CLOCK_FORMAT "%f"
-#define GRPC_PRECISE_CLOCK_PRINTF_ARGS(clk) \
- (*(clk)*grpc_precise_clock_scaling_factor())
-#else
-typedef struct grpc_precise_clock grpc_precise_clock;
-struct grpc_precise_clock {
- gpr_timespec clock;
-};
-static void grpc_precise_clock_now(grpc_precise_clock* clk) {
- clk->clock = gpr_now(GPR_CLOCK_REALTIME);
+
+static void gpr_precise_clock_now(gpr_timespec *clk) {
+ long long int counter;
+ gpr_get_cycle_counter(&counter);
+ clk->clock = GPR_CLOCK_REALTIME;
+ clk->tv_sec = counter / cycles_per_second;
+ clk->tv_nsec = counter % cycles_per_second;
}
-#define GRPC_PRECISE_CLOCK_FORMAT "%ld.%09d"
-#define GRPC_PRECISE_CLOCK_PRINTF_ARGS(clk) \
- (clk)->clock.tv_sec, (clk)->clock.tv_nsec
-static void grpc_precise_clock_print(const grpc_precise_clock* clk, FILE* fp) {
- fprintf(fp, "%ld.%09d", clk->clock.tv_sec, clk->clock.tv_nsec);
+
+#else /* GRPC_TIMERS_RDTSC */
+static void gpr_precise_clock_now(gpr_timespec *clk) {
+ *clk = gpr_now(GPR_CLOCK_REALTIME);
+ clk->clock_type = GPR_CLOCK_PRECISE;
}
#endif /* GRPC_TIMERS_RDTSC */
-#endif /* GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H */
+#endif /* GRPC_CORE_SUPPORT_TIME_PRECISE_ */
diff --git a/src/core/support/time_win32.c b/src/core/support/time_win32.c
index 7f64c80e27..f794855429 100644
--- a/src/core/support/time_win32.c
+++ b/src/core/support/time_win32.c
@@ -38,6 +38,7 @@
#ifdef GPR_WIN32
#include <grpc/support/time.h>
+#include <src/core/support/time_precise.h>
#include <sys/timeb.h>
static LARGE_INTEGER g_start_time;
@@ -68,6 +69,9 @@ gpr_timespec gpr_now(gpr_clock_type clock) {
now_tv.tv_sec = (time_t)now_dbl;
now_tv.tv_nsec = (int)((now_dbl - (double)now_tv.tv_sec) * 1e9);
break;
+ case GPR_CLOCK_PRECISE:
+ gpr_precise_clock_now(&now_tv);
+ break;
}
return now_tv;
}