X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=libust%2Ftracectl.c;h=97c515cfa68dcbbf6227c263ebc2dd2714cd256f;hb=c396a8419a176d0eda4a96a639f1cafb178e6dc7;hp=ee67daaac91fa99b6786c69bd8a3167712b535e8;hpb=6d45c11a63ffac29844304c53dffb76976ec98c1;p=lttng-ust.git diff --git a/libust/tracectl.c b/libust/tracectl.c index ee67daaa..97c515cf 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -46,6 +46,11 @@ char consumer_stack[10000]; +/* This should only be accessed by the constructor, before the creation + * of the listener, and then only by the listener. + */ +s64 pidunique = -1LL; + struct list_head blocked_consumers = LIST_HEAD_INIT(blocked_consumers); static struct ustcomm_app ustcomm_app; @@ -93,6 +98,20 @@ struct blocked_consumer { struct list_head list; }; +static long long make_pidunique(void) +{ + s64 retval; + struct timeval tv; + + gettimeofday(&tv, NULL); + + retval = tv.tv_sec; + retval <<= 32; + retval |= tv.tv_usec; + + return retval; +} + static void print_markers(FILE *fp) { struct marker_iter iter; @@ -682,6 +701,19 @@ void *listener_main(void *p) WARN("could not disable marker; channel=%s, name=%s", channel_name, marker_name); } } + else if(nth_token_is(recvbuf, "get_pidunique", 0) == 1) { + char *reply; + + asprintf(&reply, "%lld", pidunique); + + result = ustcomm_send_reply(&ustcomm_app.server, reply, &src); + if(result) { + ERR("listener: get_pidunique: ustcomm_send_reply failed"); + goto next_cmd; + } + + free(reply); + } // else if(nth_token_is(recvbuf, "get_notifications", 0) == 1) { // struct ltt_trace_struct *trace; // char trace_name[] = "auto"; @@ -867,6 +899,11 @@ static void __attribute__((constructor(1000))) init() int result; char* autoprobe_val = NULL; + /* Assign the pidunique, to be able to differentiate the processes with same + * pid, (before and after an exec). + */ + pidunique = make_pidunique(); + /* Initialize RCU in case the constructor order is not good. */ urcu_init(); @@ -1091,6 +1128,13 @@ static void __attribute__((destructor)) keepalive() ustcomm_fini_app(&ustcomm_app); } +void ust_potential_exec(void) +{ + trace_mark(ust, potential_exec, MARK_NOARGS); + + keepalive(); +} + /* Notify ust that there was a fork. This needs to be called inside * the new process, anytime a process whose memory is not shared with * the parent is created. If this function is not called, the events