api-trace.txt: add trace API documentation
authorKarsten Blees <karsten.blees@gmail.com>
Sat, 12 Jul 2014 00:08:48 +0000 (02:08 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 14 Jul 2014 04:25:21 +0000 (21:25 -0700)
Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/technical/api-trace.txt [new file with mode: 0644]
diff --git a/Documentation/technical/api-trace.txt b/Documentation/technical/api-trace.txt
new file mode 100644 (file)
index 0000000..097a651
--- /dev/null
@@ -0,0 +1,97 @@
+trace API
+=========
+
+The trace API can be used to print debug messages to stderr or a file. Trace
+code is inactive unless explicitly enabled by setting `GIT_TRACE*` environment
+variables.
+
+The trace implementation automatically adds `timestamp file:line ... \n` to
+all trace messages. E.g.:
+
+------------
+23:59:59.123456 git.c:312               trace: built-in: git 'foo'
+00:00:00.000001 builtin/foo.c:99        foo: some message
+------------
+
+Data Structures
+---------------
+
+`struct trace_key`::
+
+       Defines a trace key (or category). The default (for API functions that
+       don't take a key) is `GIT_TRACE`.
++
+E.g. to define a trace key controlled by environment variable `GIT_TRACE_FOO`:
++
+------------
+static struct trace_key trace_foo = TRACE_KEY_INIT(FOO);
+
+static void trace_print_foo(const char *message)
+{
+       trace_print_key(&trace_foo, message);
+}
+------------
++
+Note: don't use `const` as the trace implementation stores internal state in
+the `trace_key` structure.
+
+Functions
+---------
+
+`int trace_want(struct trace_key *key)`::
+
+       Checks whether the trace key is enabled. Used to prevent expensive
+       string formatting before calling one of the printing APIs.
+
+`void trace_disable(struct trace_key *key)`::
+
+       Disables tracing for the specified key, even if the environment
+       variable was set.
+
+`void trace_printf(const char *format, ...)`::
+`void trace_printf_key(struct trace_key *key, const char *format, ...)`::
+
+       Prints a formatted message, similar to printf.
+
+`void trace_argv_printf(const char **argv, const char *format, ...)``::
+
+       Prints a formatted message, followed by a quoted list of arguments.
+
+`void trace_strbuf(struct trace_key *key, const struct strbuf *data)`::
+
+       Prints the strbuf, without additional formatting (i.e. doesn't
+       choke on `%` or even `\0`).
+
+`uint64_t getnanotime(void)`::
+
+       Returns nanoseconds since the epoch (01/01/1970), typically used
+       for performance measurements.
++
+Currently there are high precision timer implementations for Linux (using
+`clock_gettime(CLOCK_MONOTONIC)`) and Windows (`QueryPerformanceCounter`).
+Other platforms use `gettimeofday` as time source.
+
+`void trace_performance(uint64_t nanos, const char *format, ...)`::
+`void trace_performance_since(uint64_t start, const char *format, ...)`::
+
+       Prints the elapsed time (in nanoseconds), or elapsed time since
+       `start`, followed by a formatted message. Enabled via environment
+       variable `GIT_TRACE_PERFORMANCE`. Used for manual profiling, e.g.:
++
+------------
+uint64_t start = getnanotime();
+/* code section to measure */
+trace_performance_since(start, "foobar");
+------------
++
+------------
+uint64_t t = 0;
+for (;;) {
+       /* ignore */
+       t -= getnanotime();
+       /* code section to measure */
+       t += getnanotime();
+       /* ignore */
+}
+trace_performance(t, "frotz");
+------------