From ed1317e78616d3fb99791d4effef7473317c41ec Mon Sep 17 00:00:00 2001 From: Pierre-Marc Fournier Date: Fri, 25 Sep 2009 15:14:52 -0400 Subject: [PATCH] add pidunique concept --- libust/tracectl.c | 37 +++++++++++++++++++++++++++++++++++++ ustd/ustd.c | 23 ++++++++++++++++++++--- ustd/ustd.h | 2 ++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/libust/tracectl.c b/libust/tracectl.c index ee67daa..1dd7162 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(); diff --git a/ustd/ustd.c b/ustd/ustd.c index fdf8d13..ddbb18b 100644 --- a/ustd/ustd.c +++ b/ustd/ustd.c @@ -326,6 +326,23 @@ int add_buffer(pid_t pid, char *bufname) return -1; } + /* get pidunique */ + asprintf(&send_msg, "get_pidunique"); + result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); + free(send_msg); + if(result == -1) { + ERR("problem in ustcomm_send_request(get_pidunique)"); + return -1; + } + + result = sscanf(received_msg, "%lld", &buf->pidunique); + if(result != 1) { + ERR("unable to parse response to get_pidunique"); + return -1; + } + free(received_msg); + DBG("got pidunique %lld", buf->pidunique); + /* get shmid */ asprintf(&send_msg, "get_shmid %s", buf->name); result = ustcomm_send_request(&buf->conn, send_msg, &received_msg); @@ -411,7 +428,7 @@ int add_buffer(pid_t pid, char *bufname) trace_path = USTD_DEFAULT_TRACE_PATH; } - asprintf(&tmp, "%s/%u", trace_path, buf->pid); + asprintf(&tmp, "%s/%u_%lld", trace_path, buf->pid, buf->pidunique); result = create_dir_if_needed(tmp); if(result == -1) { ERR("could not create directory %s", tmp); @@ -420,8 +437,8 @@ int add_buffer(pid_t pid, char *bufname) } free(tmp); - asprintf(&tmp, "%s/%u/%s_0", trace_path, buf->pid, buf->name); - result = fd = open(tmp, O_WRONLY | O_CREAT | O_TRUNC, 00600); + asprintf(&tmp, "%s/%u_%lld/%s_0", trace_path, buf->pid, buf->pidunique, buf->name); + result = fd = open(tmp, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 00600); if(result == -1) { PERROR("open"); ERR("failed opening trace file %s", tmp); diff --git a/ustd/ustd.h b/ustd/ustd.h index 0b2db77..65328d6 100644 --- a/ustd/ustd.h +++ b/ustd/ustd.h @@ -28,6 +28,8 @@ struct buffer_info { int file_fd; /* output file */ long consumed_old; + + s64 pidunique; }; ssize_t patient_write(int fd, const void *buf, size_t count); -- 2.34.1