| #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); |
| } |