68 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
| #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);
 | |
| }
 |