api-trace.txt: add trace API documentation

Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Karsten Blees committed Jul 12, 2014 at 02:08 UTC c7d3f8cb48d754371343c5a48cf392135bb4d77b
1 file changed +97
Documentation/technical/api-trace.txt new
+97
@@ -0,0 +1,97 @@
1 +trace API
2 +=========
3 +
4 +The trace API can be used to print debug messages to stderr or a file. Trace
5 +code is inactive unless explicitly enabled by setting `GIT_TRACE*` environment
6 +variables.
7 +
8 +The trace implementation automatically adds `timestamp file:line ... \n` to
9 +all trace messages. E.g.:
10 +
11 +------------
12 +23:59:59.123456 git.c:312 trace: built-in: git 'foo'
13 +00:00:00.000001 builtin/foo.c:99 foo: some message
14 +------------
15 +
16 +Data Structures
17 +---------------
18 +
19 +`struct trace_key`::
20 +
21 + Defines a trace key (or category). The default (for API functions that
22 + don't take a key) is `GIT_TRACE`.
23 ++
24 +E.g. to define a trace key controlled by environment variable `GIT_TRACE_FOO`:
25 ++
26 +------------
27 +static struct trace_key trace_foo = TRACE_KEY_INIT(FOO);
28 +
29 +static void trace_print_foo(const char *message)
30 +{
31 + trace_print_key(&trace_foo, message);
32 +}
33 +------------
34 ++
35 +Note: don't use `const` as the trace implementation stores internal state in
36 +the `trace_key` structure.
37 +
38 +Functions
39 +---------
40 +
41 +`int trace_want(struct trace_key *key)`::
42 +
43 + Checks whether the trace key is enabled. Used to prevent expensive
44 + string formatting before calling one of the printing APIs.
45 +
46 +`void trace_disable(struct trace_key *key)`::
47 +
48 + Disables tracing for the specified key, even if the environment
49 + variable was set.
50 +
51 +`void trace_printf(const char *format, ...)`::
52 +`void trace_printf_key(struct trace_key *key, const char *format, ...)`::
53 +
54 + Prints a formatted message, similar to printf.
55 +
56 +`void trace_argv_printf(const char **argv, const char *format, ...)``::
57 +
58 + Prints a formatted message, followed by a quoted list of arguments.
59 +
60 +`void trace_strbuf(struct trace_key *key, const struct strbuf *data)`::
61 +
62 + Prints the strbuf, without additional formatting (i.e. doesn't
63 + choke on `%` or even `\0`).
64 +
65 +`uint64_t getnanotime(void)`::
66 +
67 + Returns nanoseconds since the epoch (01/01/1970), typically used
68 + for performance measurements.
69 ++
70 +Currently there are high precision timer implementations for Linux (using
71 +`clock_gettime(CLOCK_MONOTONIC)`) and Windows (`QueryPerformanceCounter`).
72 +Other platforms use `gettimeofday` as time source.
73 +
74 +`void trace_performance(uint64_t nanos, const char *format, ...)`::
75 +`void trace_performance_since(uint64_t start, const char *format, ...)`::
76 +
77 + Prints the elapsed time (in nanoseconds), or elapsed time since
78 + `start`, followed by a formatted message. Enabled via environment
79 + variable `GIT_TRACE_PERFORMANCE`. Used for manual profiling, e.g.:
80 ++
81 +------------
82 +uint64_t start = getnanotime();
83 +/* code section to measure */
84 +trace_performance_since(start, "foobar");
85 +------------
86 ++
87 +------------
88 +uint64_t t = 0;
89 +for (;;) {
90 + /* ignore */
91 + t -= getnanotime();
92 + /* code section to measure */
93 + t += getnanotime();
94 + /* ignore */
95 +}
96 +trace_performance(t, "frotz");
97 +------------