1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-09 18:26:08 +02:00
git/trace2/tr2_tls.h
Jeff Hostetler 8ad575646c trace2: add stopwatch timers
Add stopwatch timer mechanism to Trace2.

Timers are an alternative to Trace2 Regions.  Regions are useful for
measuring the time spent in various computation phases, such as the
time to read the index, time to scan for unstaged files, time to scan
for untracked files, and etc.

However, regions are not appropriate in all places.  For example,
during a checkout, it would be very inefficient to use regions to
measure the total time spent inflating objects from the ODB from
across the entire lifetime of the process; a per-unzip() region would
flood the output and significantly slow the command; and some form of
post-processing would be requried to compute the time spent in unzip().

Timers can be used to measure a series of timer intervals and emit
a single summary event (at thread and/or process exit).

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-10-24 12:45:26 -07:00

121 lines
3.0 KiB
C

#ifndef TR2_TLS_H
#define TR2_TLS_H
#include "strbuf.h"
#include "trace2/tr2_tmr.h"
/*
* Notice: the term "TLS" refers to "thread-local storage" in the
* Trace2 source files. This usage is borrowed from GCC and Windows.
* There is NO relation to "transport layer security".
*/
/*
* Arbitry limit for thread names for column alignment.
*/
#define TR2_MAX_THREAD_NAME (24)
struct tr2tls_thread_ctx {
const char *thread_name;
uint64_t *array_us_start;
size_t alloc;
size_t nr_open_regions; /* plays role of "nr" in ALLOC_GROW */
int thread_id;
struct tr2_timer_block timer_block;
unsigned int used_any_timer:1;
unsigned int used_any_per_thread_timer:1;
};
/*
* Create thread-local storage for the current thread.
*
* The first thread in the process will have:
* { .thread_id=0, .thread_name="main" }
* Subsequent threads are given a non-zero thread_id and a thread_name
* constructed from the id and a thread base name (which is usually just
* the name of the thread-proc function). For example:
* { .thread_id=10, .thread_name="th10:fsm-listen" }
* This helps to identify and distinguish messages from concurrent threads.
* The ctx.thread_name field is truncated if necessary to help with column
* alignment in printf-style messages.
*
* In this and all following functions the term "self" refers to the
* current thread.
*/
struct tr2tls_thread_ctx *tr2tls_create_self(const char *thread_base_name,
uint64_t us_thread_start);
/*
* Get the thread-local storage pointer of the current thread.
*/
struct tr2tls_thread_ctx *tr2tls_get_self(void);
/*
* return true if the current thread is the main thread.
*/
int tr2tls_is_main_thread(void);
/*
* Free the current thread's thread-local storage.
*/
void tr2tls_unset_self(void);
/*
* Begin a new nested region and remember the start time.
*/
void tr2tls_push_self(uint64_t us_now);
/*
* End the innermost nested region.
*/
void tr2tls_pop_self(void);
/*
* Pop any extra (above the first) open regions on the current
* thread and discard. During a thread-exit, we should only
* have region[0] that was pushed in trace2_thread_start() if
* the thread exits normally.
*/
void tr2tls_pop_unwind_self(void);
/*
* Compute the elapsed time since the innermost region in the
* current thread started and the given time (usually now).
*/
uint64_t tr2tls_region_elasped_self(uint64_t us);
/*
* Compute the elapsed time since the main thread started
* and the given time (usually now). This is assumed to
* be the absolute run time of the process.
*/
uint64_t tr2tls_absolute_elapsed(uint64_t us);
/*
* Initialize thread-local storage for Trace2.
*/
void tr2tls_init(void);
/*
* Free all Trace2 thread-local storage resources.
*/
void tr2tls_release(void);
/*
* Protected increment of an integer.
*/
int tr2tls_locked_increment(int *p);
/*
* Capture the process start time and do nothing else.
*/
void tr2tls_start_process_clock(void);
/*
* Explicitly lock/unlock our mutex.
*/
void tr2tls_lock(void);
void tr2tls_unlock(void);
#endif /* TR2_TLS_H */