trace: add trace_performance facility to debug performance issues
[git/git.git] / trace.h
CommitLineData
5991a55c
KB
1#ifndef TRACE_H
2#define TRACE_H
3
4#include "git-compat-util.h"
5#include "strbuf.h"
6
6aa30857
KB
7struct trace_key {
8 const char * const key;
9 int fd;
10 unsigned int initialized : 1;
11 unsigned int need_close : 1;
12};
13
14#define TRACE_KEY_INIT(name) { "GIT_TRACE_" #name, 0, 0, 0 }
15
5991a55c 16extern void trace_repo_setup(const char *prefix);
6aa30857
KB
17extern int trace_want(struct trace_key *key);
18extern void trace_disable(struct trace_key *key);
148d6771 19extern uint64_t getnanotime(void);
66f66c59 20
e05bed96
KB
21#ifndef HAVE_VARIADIC_MACROS
22
66f66c59
KB
23__attribute__((format (printf, 1, 2)))
24extern void trace_printf(const char *format, ...);
25
5991a55c 26__attribute__((format (printf, 2, 3)))
6aa30857 27extern void trace_printf_key(struct trace_key *key, const char *format, ...);
66f66c59
KB
28
29__attribute__((format (printf, 2, 3)))
30extern void trace_argv_printf(const char **argv, const char *format, ...);
31
c69dfd24 32extern void trace_strbuf(struct trace_key *key, const struct strbuf *data);
5991a55c 33
09b2c1c7
KB
34/* Prints elapsed time (in nanoseconds) if GIT_TRACE_PERFORMANCE is enabled. */
35__attribute__((format (printf, 2, 3)))
36extern void trace_performance(uint64_t nanos, const char *format, ...);
37
38/* Prints elapsed time since 'start' if GIT_TRACE_PERFORMANCE is enabled. */
39__attribute__((format (printf, 2, 3)))
40extern void trace_performance_since(uint64_t start, const char *format, ...);
41
e05bed96
KB
42#else
43
44/*
45 * Macros to add file:line - see above for C-style declarations of how these
46 * should be used.
47 */
48
49/*
50 * TRACE_CONTEXT may be set to __FUNCTION__ if the compiler supports it. The
51 * default is __FILE__, as it is consistent with assert(), and static function
52 * names are not necessarily unique.
53 *
54 * __FILE__ ":" __FUNCTION__ doesn't work with GNUC, as __FILE__ is supplied
55 * by the preprocessor as a string literal, and __FUNCTION__ is filled in by
56 * the compiler as a string constant.
57 */
58#ifndef TRACE_CONTEXT
59# define TRACE_CONTEXT __FILE__
60#endif
61
62/*
63 * Note: with C99 variadic macros, __VA_ARGS__ must include the last fixed
64 * parameter ('format' in this case). Otherwise, a call without variable
65 * arguments will have a surplus ','. E.g.:
66 *
67 * #define foo(format, ...) bar(format, __VA_ARGS__)
68 * foo("test");
69 *
70 * will expand to
71 *
72 * bar("test",);
73 *
74 * which is invalid (note the ',)'). With GNUC, '##__VA_ARGS__' drops the
75 * comma, but this is non-standard.
76 */
77
78#define trace_printf(...) \
79 trace_printf_key_fl(TRACE_CONTEXT, __LINE__, NULL, __VA_ARGS__)
80
81#define trace_printf_key(key, ...) \
82 trace_printf_key_fl(TRACE_CONTEXT, __LINE__, key, __VA_ARGS__)
83
84#define trace_argv_printf(argv, ...) \
85 trace_argv_printf_fl(TRACE_CONTEXT, __LINE__, argv, __VA_ARGS__)
86
87#define trace_strbuf(key, data) \
88 trace_strbuf_fl(TRACE_CONTEXT, __LINE__, key, data)
89
09b2c1c7
KB
90#define trace_performance(nanos, ...) \
91 trace_performance_fl(TRACE_CONTEXT, __LINE__, nanos, __VA_ARGS__)
92
93#define trace_performance_since(start, ...) \
94 trace_performance_fl(TRACE_CONTEXT, __LINE__, getnanotime() - (start), \
95 __VA_ARGS__)
96
e05bed96
KB
97/* backend functions, use non-*fl macros instead */
98__attribute__((format (printf, 4, 5)))
99extern void trace_printf_key_fl(const char *file, int line, struct trace_key *key,
100 const char *format, ...);
101__attribute__((format (printf, 4, 5)))
102extern void trace_argv_printf_fl(const char *file, int line, const char **argv,
103 const char *format, ...);
104extern void trace_strbuf_fl(const char *file, int line, struct trace_key *key,
105 const struct strbuf *data);
09b2c1c7
KB
106__attribute__((format (printf, 4, 5)))
107extern void trace_performance_fl(const char *file, int line,
108 uint64_t nanos, const char *fmt, ...);
e05bed96
KB
109
110#endif /* HAVE_VARIADIC_MACROS */
111
5991a55c 112#endif /* TRACE_H */