From 9cccb08311ea969ac018a781a2fe4a0f09a7cc8b Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 13 Apr 2015 13:04:06 -0700 Subject: Stub out precise clock structure from the overall flow of timers.c so that there are no ifdefs in the middle of structures of the main code path --- src/core/profiling/timers.c | 47 +++++--------------------- src/core/profiling/timers.h | 9 +++-- src/core/profiling/timers_preciseclock.h | 57 ++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 43 deletions(-) create mode 100644 src/core/profiling/timers_preciseclock.h (limited to 'src/core/profiling') diff --git a/src/core/profiling/timers.c b/src/core/profiling/timers.c index 8fdad6e42b..74da10bf91 100644 --- a/src/core/profiling/timers.c +++ b/src/core/profiling/timers.c @@ -34,6 +34,7 @@ #ifdef GRPC_LATENCY_PROFILER #include "timers.h" +#include "timers_preciseclock.h" #include #include @@ -42,12 +43,7 @@ #include typedef struct grpc_timer_entry { -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc timers not supported yet - /* TODO(vpai): Fill in rdtsc support if desired */ -#else - gpr_timespec timer; -#endif + grpc_precise_clock tm; const char* tag; int seq; const char* file; @@ -61,22 +57,11 @@ struct grpc_timers_log { int capacity; int capacity_limit; FILE *fp; - const char *fmt; }; grpc_timers_log* grpc_timers_log_global = NULL; -static int timer_now(grpc_timer_entry *tm) { -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc not supported yet -#else - tm->timer = gpr_now(); - return(1); -#endif -} - -grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, - const char *fmt) { +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump) { grpc_timers_log* log = gpr_malloc(sizeof(*log)); /* TODO (vpai): Allow allocation below limit */ @@ -89,24 +74,19 @@ grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, log->capacity = log->capacity_limit = capacity_limit; log->fp = dump; - log->fmt = fmt; return log; } static void log_report_locked(grpc_timers_log *log) { FILE *fp = log->fp; - const char *fmt = log->fmt; int i; for (i=0;inum_entries;i++) { grpc_timer_entry* entry = &(log->log[i]); - fprintf(fp, fmt, -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc not supported -#else - entry->timer.tv_sec, entry->timer.tv_nsec, -#endif - entry->tag, entry->seq, entry->file, entry->line); + fprintf(fp, "GRPC_LAT_PROF "); + grpc_precise_clock_print(&entry->tm, fp); + fprintf(fp, " %s#%d,%s:%d\n", entry->tag, entry->seq, + entry->file, entry->line); } /* Now clear out the log */ @@ -136,7 +116,7 @@ void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, entry = &log->log[log->num_entries++]; - timer_now(entry); + grpc_precise_clock_now(&entry->tm); entry->tag = tag; entry->seq = seq; entry->file = file; @@ -146,21 +126,12 @@ void grpc_timers_log_add(grpc_timers_log *log, const char *tag, int seq, } void grpc_timers_log_global_init(void) { - grpc_timers_log_global = - grpc_timers_log_create(100000, stdout, -#ifdef GRPC_TIMERS_RDTSC -#error Rdtsc not supported -#else - "TIMER %1$ld.%2$09d %3$s seq %4$d @ %5$s:%6$d\n" -#endif - ); - /* Use positional arguments as an example for others to change fmt */ + grpc_timers_log_global = grpc_timers_log_create(100000, stdout); } void grpc_timers_log_global_destroy(void) { grpc_timers_log_destroy(grpc_timers_log_global); } - #else /* !GRPC_LATENCY_PROFILER */ void grpc_timers_log_global_init(void) { } diff --git a/src/core/profiling/timers.h b/src/core/profiling/timers.h index ee89e1f46d..f3a87752ce 100644 --- a/src/core/profiling/timers.h +++ b/src/core/profiling/timers.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPC_TIMERS_H -#define GRPC_TIMERS_H +#ifndef GRPC_CORE_PROFILING_TIMERS_H +#define GRPC_CORE_PROFILING_TIMERS_H #include @@ -44,8 +44,7 @@ extern "C" { typedef struct grpc_timers_log grpc_timers_log; -grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump, - const char *fmt); +grpc_timers_log* grpc_timers_log_create(int capacity_limit, FILE *dump); void grpc_timers_log_add(grpc_timers_log *, const char *tag, int seq, const char *file, int line); void grpc_timers_log_destroy(grpc_timers_log *); @@ -66,4 +65,4 @@ void grpc_timers_log_global_destroy(void); } #endif -#endif /* GRPC_TIMERS_H */ +#endif /* GRPC_CORE_PROFILING_TIMERS_H */ diff --git a/src/core/profiling/timers_preciseclock.h b/src/core/profiling/timers_preciseclock.h new file mode 100644 index 0000000000..c39596709a --- /dev/null +++ b/src/core/profiling/timers_preciseclock.h @@ -0,0 +1,57 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H +#define GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H + +#include +#include + +typedef struct grpc_precise_clock grpc_precise_clock; + +#ifdef GRPC_TIMERS_RDTSC +#error RDTSC timers not currently supported +#else +struct grpc_precise_clock { + gpr_timespec clock; +}; +static void grpc_precise_clock_now(grpc_precise_clock* clk) { + clk->clock = gpr_now(); +} +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); +} +#endif /* GRPC_TIMERS_RDTSC */ + + +#endif /* GRPC_CORE_PROFILING_TIMERS_PRECISECLOCK_H */ -- cgit v1.2.3