OSDN Git Service

trace: improve performance while category is disabled
authorGennady Kupava <gkupava@bloomberg.net>
Sun, 26 Nov 2017 20:11:19 +0000 (20:11 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 6 Dec 2017 17:43:02 +0000 (09:43 -0800)
Move just enough code from trace.c into trace.h header so all code
necessary to determine that trace is disabled could be inlined to
calling functions.  Then perform the check if the trace key is
enabled sooner in call chain.

Signed-off-by: Gennady Kupava <gkupava@bloomberg.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
trace.c
trace.h

diff --git a/trace.c b/trace.c
index d47ea28..b7530b5 100644 (file)
--- a/trace.c
+++ b/trace.c
@@ -25,6 +25,7 @@
 #include "quote.h"
 
 struct trace_key trace_default_key = { "GIT_TRACE", 0, 0, 0 };
+struct trace_key trace_perf_key = TRACE_KEY_INIT(PERFORMANCE);
 
 /* Get a trace file descriptor from "key" env variable. */
 static int get_trace_fd(struct trace_key *key)
@@ -172,8 +173,6 @@ void trace_strbuf_fl(const char *file, int line, struct trace_key *key,
        print_trace_line(key, &buf);
 }
 
-static struct trace_key trace_perf_key = TRACE_KEY_INIT(PERFORMANCE);
-
 static void trace_performance_vprintf_fl(const char *file, int line,
                                         uint64_t nanos, const char *format,
                                         va_list ap)
diff --git a/trace.h b/trace.h
index 24b32f8..88055ab 100644 (file)
--- a/trace.h
+++ b/trace.h
@@ -14,6 +14,7 @@ struct trace_key {
 extern struct trace_key trace_default_key;
 
 #define TRACE_KEY_INIT(name) { "GIT_TRACE_" #name, 0, 0, 0 }
+extern struct trace_key trace_perf_key;
 
 extern void trace_repo_setup(const char *prefix);
 extern int trace_want(struct trace_key *key);
@@ -79,24 +80,42 @@ extern void trace_performance_since(uint64_t start, const char *format, ...);
  * comma, but this is non-standard.
  */
 
-#define trace_printf(...) \
-       trace_printf_key_fl(TRACE_CONTEXT, __LINE__, &trace_default_key, __VA_ARGS__)
-
-#define trace_printf_key(key, ...) \
-       trace_printf_key_fl(TRACE_CONTEXT, __LINE__, key, __VA_ARGS__)
-
-#define trace_argv_printf(argv, ...) \
-       trace_argv_printf_fl(TRACE_CONTEXT, __LINE__, argv, __VA_ARGS__)
-
-#define trace_strbuf(key, data) \
-       trace_strbuf_fl(TRACE_CONTEXT, __LINE__, key, data)
-
-#define trace_performance(nanos, ...) \
-       trace_performance_fl(TRACE_CONTEXT, __LINE__, nanos, __VA_ARGS__)
-
-#define trace_performance_since(start, ...) \
-       trace_performance_fl(TRACE_CONTEXT, __LINE__, getnanotime() - (start), \
-                            __VA_ARGS__)
+#define trace_printf_key(key, ...)                                         \
+       do {                                                                \
+               if (trace_pass_fl(key))                                     \
+                       trace_printf_key_fl(TRACE_CONTEXT, __LINE__, key,   \
+                                           __VA_ARGS__);                   \
+       } while (0)
+
+#define trace_printf(...) trace_printf_key(&trace_default_key, __VA_ARGS__)
+
+#define trace_argv_printf(argv, ...)                                       \
+       do {                                                                \
+               if (trace_pass_fl(&trace_default_key))                      \
+                       trace_argv_printf_fl(TRACE_CONTEXT, __LINE__,       \
+                                           argv, __VA_ARGS__);             \
+       } while (0)
+
+#define trace_strbuf(key, data)                                                    \
+       do {                                                                \
+               if (trace_pass_fl(key))                                     \
+                       trace_strbuf_fl(TRACE_CONTEXT, __LINE__, key, data);\
+       } while (0)
+
+#define trace_performance(nanos, ...)                                      \
+       do {                                                                \
+               if (trace_pass_fl(&trace_perf_key))                         \
+                       trace_performance_fl(TRACE_CONTEXT, __LINE__, nanos,\
+                                            __VA_ARGS__);                  \
+       } while (0)
+
+#define trace_performance_since(start, ...)                                \
+       do {                                                                \
+               if (trace_pass_fl(&trace_perf_key))                         \
+                       trace_performance_fl(TRACE_CONTEXT, __LINE__,       \
+                                            getnanotime() - (start),       \
+                                            __VA_ARGS__);                  \
+       } while (0)
 
 /* backend functions, use non-*fl macros instead */
 __attribute__((format (printf, 4, 5)))
@@ -110,6 +129,10 @@ extern void trace_strbuf_fl(const char *file, int line, struct trace_key *key,
 __attribute__((format (printf, 4, 5)))
 extern void trace_performance_fl(const char *file, int line,
                                 uint64_t nanos, const char *fmt, ...);
+static inline int trace_pass_fl(struct trace_key *key)
+{
+       return key->fd || !key->initialized;
+}
 
 #endif /* HAVE_VARIADIC_MACROS */