98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
| 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");
 | |
| ------------
 |