1
1
#include "cache.h"
2
+ #include "trace2/tr2_tbuf.h"
2
3
#include "trace2/tr2_sid.h"
3
4
4
5
#define TR2_ENVVAR_PARENT_SID "GIT_TR2_PARENT_SID"
5
6
6
7
static struct strbuf tr2sid_buf = STRBUF_INIT ;
7
8
static int tr2sid_nr_git_parents ;
8
9
10
+ /*
11
+ * Compute the final component of the SID representing the current process.
12
+ * This should uniquely identify the process and be a valid filename (to
13
+ * allow writing trace2 data to per-process files). It should also be fixed
14
+ * length for possible use as a database key.
15
+ *
16
+ * "<yyyymmdd>T<hhmmss>.<fraction>Z-<host>-<process>"
17
+ *
18
+ * where <host> is a 9 character string:
19
+ * "H<first_8_chars_of_sha1_of_hostname>"
20
+ * "Localhost" when no hostname.
21
+ *
22
+ * where <process> is a 9 character string containing the least signifcant
23
+ * 32 bits in the process-id.
24
+ * "P<pid>"
25
+ * (This is an abribrary choice. On most systems pid_t is a 32 bit value,
26
+ * so limit doesn't matter. On larger systems, a truncated value is fine
27
+ * for our purposes here.)
28
+ */
29
+ static void tr2_sid_append_my_sid_component (void )
30
+ {
31
+ const struct git_hash_algo * algo = & hash_algos [GIT_HASH_SHA1 ];
32
+ struct tr2_tbuf tb_now ;
33
+ git_hash_ctx ctx ;
34
+ pid_t pid = getpid ();
35
+ unsigned char hash [GIT_MAX_RAWSZ + 1 ];
36
+ char hex [GIT_MAX_HEXSZ + 1 ];
37
+ char hostname [HOST_NAME_MAX + 1 ];
38
+
39
+ tr2_tbuf_utc_datetime (& tb_now );
40
+ strbuf_addstr (& tr2sid_buf , tb_now .buf );
41
+
42
+ strbuf_addch (& tr2sid_buf , '-' );
43
+ if (xgethostname (hostname , sizeof (hostname )))
44
+ strbuf_add (& tr2sid_buf , "Localhost" , 9 );
45
+ else {
46
+ algo -> init_fn (& ctx );
47
+ algo -> update_fn (& ctx , hostname , strlen (hostname ));
48
+ algo -> final_fn (hash , & ctx );
49
+ hash_to_hex_algop_r (hex , hash , algo );
50
+ strbuf_addch (& tr2sid_buf , 'H' );
51
+ strbuf_add (& tr2sid_buf , hex , 8 );
52
+ }
53
+
54
+ strbuf_addf (& tr2sid_buf , "-P%08" PRIx32 , (uint32_t )pid );
55
+ }
56
+
9
57
/*
10
58
* Compute a "unique" session id (SID) for the current process. This allows
11
59
* all events from this process to have a single label (much like a PID).
@@ -20,7 +68,6 @@ static int tr2sid_nr_git_parents;
20
68
*/
21
69
static void tr2_sid_compute (void )
22
70
{
23
- uint64_t us_now ;
24
71
const char * parent_sid ;
25
72
26
73
if (tr2sid_buf .len )
@@ -38,9 +85,7 @@ static void tr2_sid_compute(void)
38
85
tr2sid_nr_git_parents ++ ;
39
86
}
40
87
41
- us_now = getnanotime () / 1000 ;
42
- strbuf_addf (& tr2sid_buf , "%" PRIuMAX "-%" PRIdMAX , (uintmax_t )us_now ,
43
- (intmax_t )getpid ());
88
+ tr2_sid_append_my_sid_component ();
44
89
45
90
setenv (TR2_ENVVAR_PARENT_SID , tr2sid_buf .buf , 1 );
46
91
}
0 commit comments