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");
------------
