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
+------------