You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.5 KiB
67 lines
1.5 KiB
#include "cache.h" |
|
#include "trace2/tr2_sid.h" |
|
|
|
#define TR2_ENVVAR_PARENT_SID "GIT_TR2_PARENT_SID" |
|
|
|
static struct strbuf tr2sid_buf = STRBUF_INIT; |
|
static int tr2sid_nr_git_parents; |
|
|
|
/* |
|
* Compute a "unique" session id (SID) for the current process. This allows |
|
* all events from this process to have a single label (much like a PID). |
|
* |
|
* Export this into our environment so that all child processes inherit it. |
|
* |
|
* If we were started by another git instance, use our parent's SID as a |
|
* prefix. (This lets us track parent/child relationships even if there |
|
* is an intermediate shell process.) |
|
* |
|
* Additionally, count the number of nested git processes. |
|
*/ |
|
static void tr2_sid_compute(void) |
|
{ |
|
uint64_t us_now; |
|
const char *parent_sid; |
|
|
|
if (tr2sid_buf.len) |
|
return; |
|
|
|
parent_sid = getenv(TR2_ENVVAR_PARENT_SID); |
|
if (parent_sid && *parent_sid) { |
|
const char *p; |
|
for (p = parent_sid; *p; p++) |
|
if (*p == '/') |
|
tr2sid_nr_git_parents++; |
|
|
|
strbuf_addstr(&tr2sid_buf, parent_sid); |
|
strbuf_addch(&tr2sid_buf, '/'); |
|
tr2sid_nr_git_parents++; |
|
} |
|
|
|
us_now = getnanotime() / 1000; |
|
strbuf_addf(&tr2sid_buf, "%" PRIuMAX "-%" PRIdMAX, (uintmax_t)us_now, |
|
(intmax_t)getpid()); |
|
|
|
setenv(TR2_ENVVAR_PARENT_SID, tr2sid_buf.buf, 1); |
|
} |
|
|
|
const char *tr2_sid_get(void) |
|
{ |
|
if (!tr2sid_buf.len) |
|
tr2_sid_compute(); |
|
|
|
return tr2sid_buf.buf; |
|
} |
|
|
|
int tr2_sid_depth(void) |
|
{ |
|
if (!tr2sid_buf.len) |
|
tr2_sid_compute(); |
|
|
|
return tr2sid_nr_git_parents; |
|
} |
|
|
|
void tr2_sid_release(void) |
|
{ |
|
strbuf_release(&tr2sid_buf); |
|
}
|
|
|