This patch adds the trace name to all ustcomm structs and corresponding functions. In the long-term this should allow us to have multiple trace sessions.
Signed-off-by: Nils Carlson <[email protected]> --- include/ust/ustcmd.h | 26 ++-- include/ust/ustd.h | 1 + libust/tracectl.c | 84 +++++++++---- libustcmd/ustcmd.c | 102 +++++++-------- libustcomm/ustcomm.c | 133 ++++++++++++------- libustcomm/ustcomm.h | 17 +++ libustd/libustd.c | 44 +++++--- .../ustcmd_function_tests/ustcmd_function_tests.c | 41 +++--- ustctl/ustctl.c | 24 ++-- 9 files changed, 287 insertions(+), 185 deletions(-) diff --git a/include/ust/ustcmd.h b/include/ust/ustcmd.h index b32fe36..6273575 100644 --- a/include/ust/ustcmd.h +++ b/include/ust/ustcmd.h @@ -48,20 +48,22 @@ struct trace_event_status { }; extern pid_t *ustcmd_get_online_pids(void); -extern int ustcmd_set_marker_state(const char *channel, const char *marker, -int state, pid_t pid); -extern int ustcmd_set_subbuf_size(const char *channel, unsigned int subbuf_size, +extern int ustcmd_set_marker_state(const char *trace, const char *channel, + const char *marker, int state, pid_t pid); +extern int ustcmd_set_subbuf_size(const char *trace, const char *channel, + unsigned int subbuf_size, pid_t pid); +extern int ustcmd_set_subbuf_num(const char *trace, const char *channel, + unsigned int num, pid_t pid); +extern int ustcmd_get_subbuf_size(const char *trace, const char *channel, pid_t pid); -extern int ustcmd_set_subbuf_num(const char *channel, unsigned int num, +extern int ustcmd_get_subbuf_num(const char *trace, const char *channel, pid_t pid); -extern int ustcmd_get_subbuf_size(const char *channel, pid_t pid); -extern int ustcmd_get_subbuf_num(const char *channel, pid_t pid); -extern int ustcmd_destroy_trace(pid_t pid); -extern int ustcmd_setup_and_start(pid_t pid); -extern int ustcmd_stop_trace(pid_t pid); -extern int ustcmd_create_trace(pid_t pid); -extern int ustcmd_start_trace(pid_t pid); -extern int ustcmd_alloc_trace(pid_t pid); +extern int ustcmd_destroy_trace(const char *trace, pid_t pid); +extern int ustcmd_setup_and_start(const char *trace, pid_t pid); +extern int ustcmd_stop_trace(const char *trace, pid_t pid); +extern int ustcmd_create_trace(const char *trace, pid_t pid); +extern int ustcmd_start_trace(const char *trace, pid_t pid); +extern int ustcmd_alloc_trace(const char *trace, pid_t pid); extern int ustcmd_free_cmsf(struct marker_status *); extern unsigned int ustcmd_count_nl(const char *); extern int ustcmd_get_cmsf(struct marker_status **, pid_t); diff --git a/include/ust/ustd.h b/include/ust/ustd.h index 01b88d7..0757acb 100644 --- a/include/ust/ustd.h +++ b/include/ust/ustd.h @@ -37,6 +37,7 @@ struct ustcomm_sock; struct buffer_info { char *name; + char *trace; char *channel; int channel_cpu; diff --git a/libust/tracectl.c b/libust/tracectl.c index 5f942cd..d5ca7d2 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -149,8 +149,9 @@ static int connect_ustd(void) static void request_buffer_consumer(int sock, - const char *channel, - int cpu) + const char *trace, + const char *channel, + int cpu) { struct ustcomm_header send_header, recv_header; struct ustcomm_buffer_info buf_inf; @@ -158,6 +159,7 @@ static void request_buffer_consumer(int sock, result = ustcomm_pack_buffer_info(&send_header, &buf_inf, + trace, channel, cpu); @@ -212,7 +214,8 @@ static void inform_consumer_daemon(const char *trace_name) /* iterate on all cpus */ for (j=0; j<trace->channels[i].n_cpus; j++) { ch_name = trace->channels[i].channel_name; - request_buffer_consumer(sock, ch_name, j); + request_buffer_consumer(sock, trace_name, + ch_name, j); STORE_SHARED(buffers_to_export, LOAD_SHARED(buffers_to_export)+1); } @@ -545,10 +548,6 @@ static void force_subbuf_switch() /* Simple commands are those which need only respond with a return value. */ static int process_simple_client_cmd(int command, char *recv_buf) { - int result; - char trace_type[] = "ustrelay"; - char trace_name[] = "auto"; - switch(command) { case SET_SOCK_PATH: { @@ -564,6 +563,27 @@ static int process_simple_client_cmd(int command, char *recv_buf) } return setenv("UST_DAEMON_SOCKET", sock_msg->sock_path, 1); } + + case FORCE_SUBBUF_SWITCH: + /* FIXME: return codes? */ + force_subbuf_switch(); + + break; + + default: + return -EINVAL; + } + + return 0; +} + + +static int process_trace_cmd(int command, char *trace_name) +{ + int result; + char trace_type[] = "ustrelay"; + + switch(command) { case START: /* start is an operation that setups the trace, allocates it and starts it */ result = ltt_trace_setup(trace_name); @@ -675,19 +695,12 @@ static int process_simple_client_cmd(int command, char *recv_buf) return result; } return 0; - case FORCE_SUBBUF_SWITCH: - /* FIXME: return codes? */ - force_subbuf_switch(); - - break; - - default: - return -EINVAL; } return 0; } + static void process_channel_cmd(int sock, int command, struct ustcomm_channel_info *ch_inf) { @@ -695,14 +708,13 @@ static void process_channel_cmd(int sock, int command, struct ustcomm_header *reply_header = &_reply_header; struct ustcomm_channel_info *reply_msg = (struct ustcomm_channel_info *)send_buffer; - char trace_name[] = "auto"; int result, offset = 0, num, size; memset(reply_header, 0, sizeof(*reply_header)); switch (command) { case GET_SUBBUF_NUM_SIZE: - result = get_subbuf_num_size(trace_name, + result = get_subbuf_num_size(ch_inf->trace, ch_inf->channel, &num, &size); if (result < 0) { @@ -719,13 +731,13 @@ static void process_channel_cmd(int sock, int command, break; case SET_SUBBUF_NUM: - reply_header->result = set_subbuf_num(trace_name, + reply_header->result = set_subbuf_num(ch_inf->trace, ch_inf->channel, ch_inf->subbuf_num); break; case SET_SUBBUF_SIZE: - reply_header->result = set_subbuf_size(trace_name, + reply_header->result = set_subbuf_size(ch_inf->trace, ch_inf->channel, ch_inf->subbuf_size); @@ -744,7 +756,6 @@ static void process_buffer_cmd(int sock, int command, struct ustcomm_header *reply_header = &_reply_header; struct ustcomm_buffer_info *reply_msg = (struct ustcomm_buffer_info *)send_buffer; - char trace_name[] = "auto"; int result, offset = 0, buf_shmid, buf_struct_shmid, buf_pipe_fd; long consumed_old; @@ -752,7 +763,8 @@ static void process_buffer_cmd(int sock, int command, switch (command) { case GET_BUF_SHMID_PIPE_FD: - result = get_buffer_shmid_pipe_fd(trace_name, buf_inf->channel, + result = get_buffer_shmid_pipe_fd(buf_inf->trace, + buf_inf->channel, buf_inf->ch_cpu, &buf_shmid, &buf_struct_shmid, @@ -777,12 +789,12 @@ static void process_buffer_cmd(int sock, int command, case NOTIFY_BUF_MAPPED: reply_header->result = - notify_buffer_mapped(trace_name, + notify_buffer_mapped(buf_inf->trace, buf_inf->channel, buf_inf->ch_cpu); break; case GET_SUBBUFFER: - result = get_subbuffer(trace_name, buf_inf->channel, + result = get_subbuffer(buf_inf->trace, buf_inf->channel, buf_inf->ch_cpu, &consumed_old); if (result < 0) { reply_header->result = result; @@ -796,7 +808,7 @@ static void process_buffer_cmd(int sock, int command, break; case PUT_SUBBUFFER: - result = put_subbuffer(trace_name, buf_inf->channel, + result = put_subbuffer(buf_inf->trace, buf_inf->channel, buf_inf->ch_cpu, buf_inf->consumed_old); reply_header->result = result; @@ -1008,6 +1020,30 @@ static void process_client_cmd(struct ustcomm_header *recv_header, goto send_response; } + case START: + case SETUP_TRACE: + case ALLOC_TRACE: + case CREATE_TRACE: + case START_TRACE: + case STOP_TRACE: + case DESTROY_TRACE: + { + struct ustcomm_trace_info *trace_inf = + (struct ustcomm_trace_info *)recv_buf; + + result = ustcomm_unpack_trace_info(trace_inf); + if (result < 0) { + ERR("couldn't unpack trace info"); + reply_header->result = -EINVAL; + goto send_response; + } + + reply_header->result = + process_trace_cmd(recv_header->command, + trace_inf->trace); + goto send_response; + + } default: reply_header->result = process_simple_client_cmd(recv_header->command, diff --git a/libustcmd/ustcmd.c b/libustcmd/ustcmd.c index a53455a..bffd3c2 100644 --- a/libustcmd/ustcmd.c +++ b/libustcmd/ustcmd.c @@ -140,8 +140,8 @@ pid_t *ustcmd_get_online_pids(void) * @param pid Traced process ID * @return 0 if successful, or errors {USTCMD_ERR_GEN, USTCMD_ERR_ARG} */ -int ustcmd_set_marker_state(const char *channel, const char *marker, - int state, pid_t pid) +int ustcmd_set_marker_state(const char *trace, const char *channel, + const char *marker, int state, pid_t pid) { struct ustcomm_header req_header, res_header; struct ustcomm_marker_info marker_inf; @@ -149,6 +149,7 @@ int ustcmd_set_marker_state(const char *channel, const char *marker, result = ustcomm_pack_marker_info(&req_header, &marker_inf, + trace, channel, marker); if (result < 0) { @@ -169,8 +170,8 @@ int ustcmd_set_marker_state(const char *channel, const char *marker, * @param pid Traced process ID * @return 0 if successful, or error */ -int ustcmd_set_subbuf_size(const char *channel, unsigned int subbuf_size, - pid_t pid) +int ustcmd_set_subbuf_size(const char *trace, const char *channel, + unsigned int subbuf_size, pid_t pid) { struct ustcomm_header req_header, res_header; struct ustcomm_channel_info ch_inf; @@ -178,6 +179,7 @@ int ustcmd_set_subbuf_size(const char *channel, unsigned int subbuf_size, result = ustcomm_pack_channel_info(&req_header, &ch_inf, + trace, channel); if (result < 0) { errno = -result; @@ -198,8 +200,8 @@ int ustcmd_set_subbuf_size(const char *channel, unsigned int subbuf_size, * @param pid Traced process ID * @return 0 if successful, or error */ -int ustcmd_set_subbuf_num(const char *channel, unsigned int num, - pid_t pid) +int ustcmd_set_subbuf_num(const char *trace, const char *channel, + unsigned int num, pid_t pid) { struct ustcomm_header req_header, res_header; struct ustcomm_channel_info ch_inf; @@ -207,6 +209,7 @@ int ustcmd_set_subbuf_num(const char *channel, unsigned int num, result = ustcomm_pack_channel_info(&req_header, &ch_inf, + trace, channel); if (result < 0) { errno = -result; @@ -221,8 +224,8 @@ int ustcmd_set_subbuf_num(const char *channel, unsigned int num, } -static int ustcmd_get_subbuf_num_size(const char *channel, pid_t pid, - int *num, int *size) +static int ustcmd_get_subbuf_num_size(const char *trace, const char *channel, + pid_t pid, int *num, int *size) { struct ustcomm_header req_header, res_header; struct ustcomm_channel_info ch_inf, *ch_inf_res; @@ -231,6 +234,7 @@ static int ustcmd_get_subbuf_num_size(const char *channel, pid_t pid, result = ustcomm_pack_channel_info(&req_header, &ch_inf, + trace, channel); if (result < 0) { errno = -result; @@ -260,11 +264,11 @@ static int ustcmd_get_subbuf_num_size(const char *channel, pid_t pid, * @param pid Traced process ID * @return subbuf cnf if successful, or error */ -int ustcmd_get_subbuf_num(const char *channel, pid_t pid) +int ustcmd_get_subbuf_num(const char *trace, const char *channel, pid_t pid) { int num, size, result; - result = ustcmd_get_subbuf_num_size(channel, pid, + result = ustcmd_get_subbuf_num_size(trace, channel, pid, &num, &size); if (result < 0) { errno = -result; @@ -281,11 +285,11 @@ int ustcmd_get_subbuf_num(const char *channel, pid_t pid) * @param pid Traced process ID * @return subbuf size if successful, or error */ -int ustcmd_get_subbuf_size(const char *channel, pid_t pid) +int ustcmd_get_subbuf_size(const char *trace, const char *channel, pid_t pid) { int num, size, result; - result = ustcmd_get_subbuf_num_size(channel, pid, + result = ustcmd_get_subbuf_num_size(trace, channel, pid, &num, &size); if (result < 0) { errno = -result; @@ -295,20 +299,35 @@ int ustcmd_get_subbuf_size(const char *channel, pid_t pid) return size; } + +static int do_trace_cmd(const char *trace, pid_t pid, int command) +{ + struct ustcomm_header req_header, res_header; + struct ustcomm_trace_info trace_inf; + int result; + + result = ustcomm_pack_trace_info(&req_header, + &trace_inf, + trace); + if (result < 0) { + errno = -result; + return -1; + } + + req_header.command = command; + + return do_cmd(pid, &req_header, (char *)&trace_inf, &res_header, NULL); +} + /** * Destroys an UST trace according to a PID. * * @param pid Traced process ID * @return 0 if successful, or error USTCMD_ERR_GEN */ -int ustcmd_destroy_trace(pid_t pid) +int ustcmd_destroy_trace(const char *trace, pid_t pid) { - struct ustcomm_header req_header, res_header; - - req_header.command = DESTROY_TRACE; - req_header.size = 0; - - return do_cmd(pid, &req_header, NULL, &res_header, NULL); + return do_trace_cmd(trace, pid, DESTROY_TRACE); } /** @@ -317,14 +336,9 @@ int ustcmd_destroy_trace(pid_t pid) * @param pid Traced process ID * @return 0 if successful, or error USTCMD_ERR_GEN */ -int ustcmd_setup_and_start(pid_t pid) +int ustcmd_setup_and_start(const char *trace, pid_t pid) { - struct ustcomm_header req_header, res_header; - - req_header.command = START; - req_header.size = 0; - - return do_cmd(pid, &req_header, NULL, &res_header, NULL); + return do_trace_cmd(trace, pid, START); } /** @@ -333,14 +347,9 @@ int ustcmd_setup_and_start(pid_t pid) * @param pid Traced process ID * @return 0 if successful, or error USTCMD_ERR_GEN */ -int ustcmd_create_trace(pid_t pid) +int ustcmd_create_trace(const char *trace, pid_t pid) { - struct ustcomm_header req_header, res_header; - - req_header.command = CREATE_TRACE; - req_header.size = 0; - - return do_cmd(pid, &req_header, NULL, &res_header, NULL); + return do_trace_cmd(trace, pid, CREATE_TRACE); } /** @@ -349,14 +358,9 @@ int ustcmd_create_trace(pid_t pid) * @param pid Traced process ID * @return 0 if successful, or error USTCMD_ERR_GEN */ -int ustcmd_start_trace(pid_t pid) +int ustcmd_start_trace(const char *trace, pid_t pid) { - struct ustcomm_header req_header, res_header; - - req_header.command = START_TRACE; - req_header.size = 0; - - return do_cmd(pid, &req_header, NULL, &res_header, NULL); + return do_trace_cmd(trace, pid, START_TRACE); } /** @@ -365,14 +369,9 @@ int ustcmd_start_trace(pid_t pid) * @param pid Traced process ID * @return 0 if successful, or error USTCMD_ERR_GEN */ -int ustcmd_alloc_trace(pid_t pid) +int ustcmd_alloc_trace(const char *trace, pid_t pid) { - struct ustcomm_header req_header, res_header; - - req_header.command = ALLOC_TRACE; - req_header.size = 0; - - return do_cmd(pid, &req_header, NULL, &res_header, NULL); + return do_trace_cmd(trace, pid, ALLOC_TRACE); } /** @@ -381,14 +380,9 @@ int ustcmd_alloc_trace(pid_t pid) * @param pid Traced process ID * @return 0 if successful, or error USTCMD_ERR_GEN */ -int ustcmd_stop_trace(pid_t pid) +int ustcmd_stop_trace(const char *trace, pid_t pid) { - struct ustcomm_header req_header, res_header; - - req_header.command = STOP_TRACE; - req_header.size = 0; - - return do_cmd(pid, &req_header, NULL, &res_header, NULL); + return do_trace_cmd(trace, pid, STOP_TRACE); } /** diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c index 2c547ab..bbdbd7e 100644 --- a/libustcomm/ustcomm.c +++ b/libustcomm/ustcomm.c @@ -621,13 +621,55 @@ char * ustcomm_restore_ptr(char *ptr, char *data_field, int data_field_size) return data_field + (long)ptr; } +int ustcomm_pack_trace_info(struct ustcomm_header *header, + struct ustcomm_trace_info *trace_inf, + const char *trace) +{ + int offset = 0; + + trace_inf->trace = ustcomm_print_data(trace_inf->data, + sizeof(trace_inf->data), + &offset, + trace); + + if (trace_inf->trace == USTCOMM_POISON_PTR) { + return -ENOMEM; + } + + header->size = COMPUTE_MSG_SIZE(trace_inf, offset); + + return 0; +} + + +int ustcomm_unpack_trace_info(struct ustcomm_trace_info *trace_inf) +{ + trace_inf->trace = ustcomm_restore_ptr(trace_inf->trace, + trace_inf->data, + sizeof(trace_inf->data)); + if (!trace_inf->trace) { + return -EINVAL; + } + + return 0; +} int ustcomm_pack_channel_info(struct ustcomm_header *header, struct ustcomm_channel_info *ch_inf, + const char *trace, const char *channel) { int offset = 0; + ch_inf->trace = ustcomm_print_data(ch_inf->data, + sizeof(ch_inf->data), + &offset, + trace); + + if (ch_inf->trace == USTCOMM_POISON_PTR) { + return -ENOMEM; + } + ch_inf->channel = ustcomm_print_data(ch_inf->data, sizeof(ch_inf->data), &offset, @@ -645,6 +687,13 @@ int ustcomm_pack_channel_info(struct ustcomm_header *header, int ustcomm_unpack_channel_info(struct ustcomm_channel_info *ch_inf) { + ch_inf->trace = ustcomm_restore_ptr(ch_inf->trace, + ch_inf->data, + sizeof(ch_inf->data)); + if (!ch_inf->trace) { + return -EINVAL; + } + ch_inf->channel = ustcomm_restore_ptr(ch_inf->channel, ch_inf->data, sizeof(ch_inf->data)); @@ -657,11 +706,21 @@ int ustcomm_unpack_channel_info(struct ustcomm_channel_info *ch_inf) int ustcomm_pack_buffer_info(struct ustcomm_header *header, struct ustcomm_buffer_info *buf_inf, + const char *trace, const char *channel, int channel_cpu) { int offset = 0; + buf_inf->trace = ustcomm_print_data(buf_inf->data, + sizeof(buf_inf->data), + &offset, + trace); + + if (buf_inf->trace == USTCOMM_POISON_PTR) { + return -ENOMEM; + } + buf_inf->channel = ustcomm_print_data(buf_inf->data, sizeof(buf_inf->data), &offset, @@ -681,6 +740,13 @@ int ustcomm_pack_buffer_info(struct ustcomm_header *header, int ustcomm_unpack_buffer_info(struct ustcomm_buffer_info *buf_inf) { + buf_inf->trace = ustcomm_restore_ptr(buf_inf->trace, + buf_inf->data, + sizeof(buf_inf->data)); + if (!buf_inf->trace) { + return -EINVAL; + } + buf_inf->channel = ustcomm_restore_ptr(buf_inf->channel, buf_inf->data, sizeof(buf_inf->data)); @@ -693,11 +759,22 @@ int ustcomm_unpack_buffer_info(struct ustcomm_buffer_info *buf_inf) int ustcomm_pack_marker_info(struct ustcomm_header *header, struct ustcomm_marker_info *marker_inf, + const char *trace, const char *channel, const char *marker) { int offset = 0; + marker_inf->trace = ustcomm_print_data(marker_inf->data, + sizeof(marker_inf->data), + &offset, + trace); + + if (marker_inf->trace == USTCOMM_POISON_PTR) { + return -ENOMEM; + } + + marker_inf->channel = ustcomm_print_data(marker_inf->data, sizeof(marker_inf->data), &offset, @@ -724,6 +801,13 @@ int ustcomm_pack_marker_info(struct ustcomm_header *header, int ustcomm_unpack_marker_info(struct ustcomm_marker_info *marker_inf) { + marker_inf->trace = ustcomm_restore_ptr(marker_inf->trace, + marker_inf->data, + sizeof(marker_inf->data)); + if (!marker_inf->trace) { + return -EINVAL; + } + marker_inf->channel = ustcomm_restore_ptr(marker_inf->channel, marker_inf->data, sizeof(marker_inf->data)); @@ -775,52 +859,3 @@ int ustcomm_unpack_sock_path(struct ustcomm_sock_path *sock_path_inf) return 0; } -int ustcomm_send_ch_req(int sock, char *channel, int command, - struct ustcomm_header *recv_header, - char *recv_data) -{ - struct ustcomm_header send_header; - struct ustcomm_channel_info ch_info; - int result; - - result = ustcomm_pack_channel_info(&send_header, - &ch_info, - channel); - if (result < 0) { - return result; - } - - send_header.command = command; - - return ustcomm_req(sock, - &send_header, - (char *)&ch_info, - recv_header, - recv_data); -} - -int ustcomm_send_buf_req(int sock, char *channel, int ch_cpu, - int command, - struct ustcomm_header *recv_header, - char *recv_data) -{ - struct ustcomm_header send_header; - struct ustcomm_buffer_info buf_info; - int result; - - result = ustcomm_pack_buffer_info(&send_header, - &buf_info, - channel, - ch_cpu); - if (result < 0) { - return result; - } - - send_header.command = command; - - return ustcomm_req(sock, - &send_header, - (char *)&buf_info, - recv_header, - recv_data); -} diff --git a/libustcomm/ustcomm.h b/libustcomm/ustcomm.h index f62250c..2d5ac5c 100644 --- a/libustcomm/ustcomm.h +++ b/libustcomm/ustcomm.h @@ -78,7 +78,13 @@ enum tracectl_commands { STOP_TRACE, }; +struct ustcomm_trace_info { + char *trace; + char data[USTCOMM_DATA_SIZE]; +}; + struct ustcomm_channel_info { + char *trace; char *channel; unsigned int subbuf_size; unsigned int subbuf_num; @@ -86,6 +92,7 @@ struct ustcomm_channel_info { }; struct ustcomm_buffer_info { + char *trace; char *channel; int ch_cpu; pid_t pid; @@ -96,6 +103,7 @@ struct ustcomm_buffer_info { }; struct ustcomm_marker_info { + char *trace; char *channel; char *marker; char data[USTCOMM_DATA_SIZE]; @@ -172,14 +180,22 @@ extern char * ustcomm_restore_ptr(char *ptr, char *data_field, (size_t) (long)(struct_ptr)->data - (long)(struct_ptr) + (offset) /* Packing and unpacking functions, making life easier */ +extern int ustcomm_pack_trace_info(struct ustcomm_header *header, + struct ustcomm_trace_info *trace_inf, + const char *trace); + +extern int ustcomm_unpack_trace_info(struct ustcomm_trace_info *trace_inf); + extern int ustcomm_pack_channel_info(struct ustcomm_header *header, struct ustcomm_channel_info *ch_inf, + const char *trace, const char *channel); extern int ustcomm_unpack_channel_info(struct ustcomm_channel_info *ch_inf); extern int ustcomm_pack_buffer_info(struct ustcomm_header *header, struct ustcomm_buffer_info *buf_inf, + const char *trace, const char *channel, int channel_cpu); @@ -187,6 +203,7 @@ extern int ustcomm_unpack_buffer_info(struct ustcomm_buffer_info *buf_inf); extern int ustcomm_pack_marker_info(struct ustcomm_header *header, struct ustcomm_marker_info *marker_inf, + const char *trace, const char *channel, const char *marker); diff --git a/libustd/libustd.c b/libustd/libustd.c index 6e7b0cd..1581f83 100644 --- a/libustd/libustd.c +++ b/libustd/libustd.c @@ -61,7 +61,7 @@ static int get_subbuffer(struct buffer_info *buf) send_msg = &_send_msg; recv_msg = &_recv_msg; - result = ustcomm_pack_buffer_info(send_hdr, send_msg, + result = ustcomm_pack_buffer_info(send_hdr, send_msg, buf->trace, buf->channel, buf->channel_cpu); if (result < 0) { return result; @@ -105,7 +105,7 @@ static int put_subbuffer(struct buffer_info *buf) recv_hdr = &_recv_hdr; send_msg = &_send_msg; - result = ustcomm_pack_buffer_info(send_hdr, send_msg, + result = ustcomm_pack_buffer_info(send_hdr, send_msg, buf->trace, buf->channel, buf->channel_cpu); if (result < 0) { return result; @@ -189,7 +189,7 @@ static int get_buf_shmid_pipe_fd(int sock, struct buffer_info *buf, send_msg = &_send_msg; recv_msg = &_recv_msg; - result = ustcomm_pack_buffer_info(send_hdr, send_msg, + result = ustcomm_pack_buffer_info(send_hdr, send_msg, buf->trace, buf->channel, buf->channel_cpu); if (result < 0) { ERR("Failed to pack buffer info"); @@ -234,7 +234,7 @@ static int get_subbuf_num_size(int sock, struct buffer_info *buf, send_msg = &_send_msg; recv_msg = &_recv_msg; - result = ustcomm_pack_channel_info(send_hdr, send_msg, + result = ustcomm_pack_channel_info(send_hdr, send_msg, buf->trace, buf->channel); if (result < 0) { return result; @@ -266,7 +266,7 @@ static int notify_buffer_mapped(int sock, struct buffer_info *buf) recv_hdr = &_recv_hdr; send_msg = &_send_msg; - result = ustcomm_pack_buffer_info(send_hdr, send_msg, + result = ustcomm_pack_buffer_info(send_hdr, send_msg, buf->trace, buf->channel, buf->channel_cpu); if (result < 0) { return result; @@ -285,7 +285,8 @@ static int notify_buffer_mapped(int sock, struct buffer_info *buf) struct buffer_info *connect_buffer(struct libustd_instance *instance, pid_t pid, - const char *channel, int channel_cpu) + const char *trace, const char *channel, + int channel_cpu) { struct buffer_info *buf; int result; @@ -297,9 +298,14 @@ struct buffer_info *connect_buffer(struct libustd_instance *instance, pid_t pid, return NULL; } + buf->trace = strdup(trace); + if (!buf->trace) { + goto free_buf; + } + buf->channel = strdup(channel); if (!buf->channel) { - goto free_buf; + goto free_buf_trace; } result = asprintf(&buf->name, "%s_%d", channel, channel_cpu); @@ -403,6 +409,9 @@ free_buf_name: free_buf_channel: free(buf->channel); +free_buf_trace: + free(buf->trace); + free_buf: free(buf); return NULL; @@ -508,6 +517,7 @@ int consumer_loop(struct libustd_instance *instance, struct buffer_info *buf) struct consumer_thread_args { pid_t pid; + const char *trace; const char *channel; int channel_cpu; struct libustd_instance *instance; @@ -545,7 +555,7 @@ void *consumer_thread(void *arg) goto end; } - buf = connect_buffer(args->instance, args->pid, + buf = connect_buffer(args->instance, args->pid, args->trace, args->channel, args->channel_cpu); if(buf == NULL) { ERR("failed to connect to buffer"); @@ -567,7 +577,8 @@ void *consumer_thread(void *arg) } int start_consuming_buffer(struct libustd_instance *instance, pid_t pid, - const char *channel, int channel_cpu) + const char *trace, const char *channel, + int channel_cpu) { pthread_t thr; struct consumer_thread_args *args; @@ -582,11 +593,12 @@ int start_consuming_buffer(struct libustd_instance *instance, pid_t pid, } args->pid = pid; + args->trace = strdup(trace); args->channel = strdup(channel); args->channel_cpu = channel_cpu; args->instance = instance; - DBG("beginning2 of start_consuming_buffer: args: pid %d bufname %s_%d", - args->pid, args->channel, args->channel_cpu); + DBG("beginning2 of start_consuming_buffer: args: pid %d trace %s" + " bufname %s_%d", args->pid, args->channel, args->channel_cpu); result = pthread_create(&thr, NULL, consumer_thread, args); if(result == -1) { @@ -598,8 +610,8 @@ int start_consuming_buffer(struct libustd_instance *instance, pid_t pid, ERR("pthread_detach failed"); return -1; } - DBG("end of start_consuming_buffer: args: pid %d bufname %s_%d", - args->pid, args->channel, args->channel_cpu); + DBG("end of start_consuming_buffer: args: pid %d trace %s " + "bufname %s_%d", args->pid, args->channel, args->channel_cpu); return 0; } @@ -623,9 +635,11 @@ static void process_client_cmd(int sock, struct ustcomm_header *req_header, return; } - DBG("Going to consume buffer %s_%d in process %d", - buf_inf->channel, buf_inf->ch_cpu, buf_inf->pid); + DBG("Going to consume trace %s buffer %s_%d in process %d", + buf_inf->trace, buf_inf->channel, buf_inf->ch_cpu, + buf_inf->pid); result = start_consuming_buffer(instance, buf_inf->pid, + buf_inf->trace, buf_inf->channel, buf_inf->ch_cpu); if (result < 0) { diff --git a/tests/ustcmd_function_tests/ustcmd_function_tests.c b/tests/ustcmd_function_tests/ustcmd_function_tests.c index 8a3376e..d44dafc 100644 --- a/tests/ustcmd_function_tests/ustcmd_function_tests.c +++ b/tests/ustcmd_function_tests/ustcmd_function_tests.c @@ -34,6 +34,7 @@ static void ustcmd_function_tests(pid_t pid) struct marker_status *marker_status, *ms_ptr; char *old_socket_path, *new_socket_path; char *tmp_ustd_socket = "/tmp/tmp_ustd_socket"; + char *trace = "auto"; printf("Connecting to pid %d\n", pid); @@ -75,79 +76,79 @@ static void ustcmd_function_tests(pid_t pid) free(old_socket_path); /* Enable, disable markers */ - tap_ok(!ustcmd_set_marker_state("ust", "bar", 1, pid), + tap_ok(!ustcmd_set_marker_state(trace, "ust", "bar", 1, pid), "ustcmd_set_marker_state - existing marker ust bar"); /* Create and allocate a trace */ - tap_ok(!ustcmd_create_trace(pid), "ustcmd_create_trace"); + tap_ok(!ustcmd_create_trace(trace, pid), "ustcmd_create_trace"); - tap_ok(!ustcmd_alloc_trace(pid), "ustcmd_alloc_trace"); + tap_ok(!ustcmd_alloc_trace(trace, pid), "ustcmd_alloc_trace"); /* Get subbuf size and number */ - subbuf_num = ustcmd_get_subbuf_num("ust", pid); + subbuf_num = ustcmd_get_subbuf_num(trace, "ust", pid); tap_ok(subbuf_num > 0, "ustcmd_get_subbuf_num - %d sub-buffers", subbuf_num); - subbuf_size = ustcmd_get_subbuf_size("ust", pid); + subbuf_size = ustcmd_get_subbuf_size(trace, "ust", pid); tap_ok(subbuf_size, "ustcmd_get_subbuf_size - sub-buffer size is %d", subbuf_size); /* Start the trace */ - tap_ok(!ustcmd_start_trace(pid), "ustcmd_start_trace"); + tap_ok(!ustcmd_start_trace(trace, pid), "ustcmd_start_trace"); /* Stop the trace and destroy it*/ - tap_ok(!ustcmd_stop_trace(pid), "ustcmd_stop_trace"); + tap_ok(!ustcmd_stop_trace(trace, pid), "ustcmd_stop_trace"); - tap_ok(!ustcmd_destroy_trace(pid), "ustcmd_destroy_trace"); + tap_ok(!ustcmd_destroy_trace(trace, pid), "ustcmd_destroy_trace"); /* Create a new trace */ - tap_ok(!ustcmd_create_trace(pid), "ustcmd_create_trace - create a new trace"); + tap_ok(!ustcmd_create_trace(trace, pid), "ustcmd_create_trace - create a new trace"); printf("Setting new subbufer number and sizes (doubling)\n"); new_subbuf_num = 2 * subbuf_num; new_subbuf_size = 2 * subbuf_size; - tap_ok(!ustcmd_set_subbuf_num("ust", new_subbuf_num, pid), + tap_ok(!ustcmd_set_subbuf_num(trace, "ust", new_subbuf_num, pid), "ustcmd_set_subbuf_num"); - tap_ok(!ustcmd_set_subbuf_size("ust", new_subbuf_size, pid), + tap_ok(!ustcmd_set_subbuf_size(trace, "ust", new_subbuf_size, pid), "ustcmd_set_subbuf_size"); /* Allocate the new trace */ - tap_ok(!ustcmd_alloc_trace(pid), "ustcmd_alloc_trace - allocate the new trace"); + tap_ok(!ustcmd_alloc_trace(trace, pid), "ustcmd_alloc_trace - allocate the new trace"); /* Get subbuf size and number and compare with what was set */ - subbuf_num = ustcmd_get_subbuf_num("ust", pid); + subbuf_num = ustcmd_get_subbuf_num(trace, "ust", pid); - subbuf_size = ustcmd_get_subbuf_size("ust", pid); + subbuf_size = ustcmd_get_subbuf_size(trace, "ust", pid); tap_ok(subbuf_num == new_subbuf_num, "Set a new subbuf number, %d == %d", subbuf_num, new_subbuf_num); - result = ustcmd_get_subbuf_size("ust", pid); + result = ustcmd_get_subbuf_size(trace, "ust", pid); tap_ok(subbuf_size == new_subbuf_size, "Set a new subbuf size, %d == %d", subbuf_size, new_subbuf_size); - tap_ok(!ustcmd_destroy_trace(pid), "ustcmd_destroy_trace - without ever starting"); + tap_ok(!ustcmd_destroy_trace(trace, pid), "ustcmd_destroy_trace - without ever starting"); printf("##### Tests that definetly should work are completed #####\n"); printf("############## Start expected failure cases ##############\n"); - tap_ok(ustcmd_set_marker_state("ust","bar", 1, pid), + tap_ok(ustcmd_set_marker_state(trace, "ust","bar", 1, pid), "Enable already enabled marker ust/bar"); - tap_ok(ustcmd_set_marker_state("ustl", "blar", 1, pid), + tap_ok(ustcmd_set_marker_state(trace, "ustl", "blar", 1, pid), "Enable non-existent marker ustl blar"); - tap_ok(ustcmd_start_trace(pid), + tap_ok(ustcmd_start_trace(trace, pid), "Start a non-existent trace"); - tap_ok(ustcmd_destroy_trace(pid), + tap_ok(ustcmd_destroy_trace(trace, pid), "Destroy non-existent trace"); exit(tap_status() ? EXIT_FAILURE : EXIT_SUCCESS); diff --git a/ustctl/ustctl.c b/ustctl/ustctl.c index 48aa758..aad3834 100644 --- a/ustctl/ustctl.c +++ b/ustctl/ustctl.c @@ -216,6 +216,8 @@ static int scan_ch_and_num(const char *ch_num, char **channel, unsigned int *num } } +char *trace = "auto"; + int main(int argc, char *argv[]) { pid_t *pidit; @@ -272,7 +274,7 @@ int main(int argc, char *argv[]) while(*pidit != -1) { switch (opts.cmd) { case CREATE_TRACE: - result = ustcmd_create_trace(*pidit); + result = ustcmd_create_trace(trace, *pidit); if (result) { ERR("error while trying to create trace with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -281,7 +283,7 @@ int main(int argc, char *argv[]) break; case START_TRACE: - result = ustcmd_start_trace(*pidit); + result = ustcmd_start_trace(trace, *pidit); if (result) { ERR("error while trying to for trace with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -290,7 +292,7 @@ int main(int argc, char *argv[]) break; case STOP_TRACE: - result = ustcmd_stop_trace(*pidit); + result = ustcmd_stop_trace(trace, *pidit); if (result) { ERR("error while trying to stop trace for PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -299,7 +301,7 @@ int main(int argc, char *argv[]) break; case DESTROY_TRACE: - result = ustcmd_destroy_trace(*pidit); + result = ustcmd_destroy_trace(trace, *pidit); if (result) { ERR("error while trying to destroy trace with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -355,7 +357,7 @@ int main(int argc, char *argv[]) retval = EXIT_FAILURE; break; } - if (ustcmd_set_marker_state(channel, marker, 1, *pidit)) { + if (ustcmd_set_marker_state(trace, channel, marker, 1, *pidit)) { PERROR("error while trying to enable marker %s with PID %u", opts.regex, (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -372,7 +374,7 @@ int main(int argc, char *argv[]) retval = EXIT_FAILURE; break; } - if (ustcmd_set_marker_state(channel, marker, 0, *pidit)) { + if (ustcmd_set_marker_state(trace, channel, marker, 0, *pidit)) { ERR("error while trying to disable marker %s with PID %u\n", opts.regex, (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -389,7 +391,7 @@ int main(int argc, char *argv[]) break; } - if (ustcmd_set_subbuf_size(channel, size, *pidit)) { + if (ustcmd_set_subbuf_size(trace, channel, size, *pidit)) { ERR("error while trying to set the size of subbuffers with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -411,7 +413,7 @@ int main(int argc, char *argv[]) retval = EXIT_FAILURE; break; } - if (ustcmd_set_subbuf_num(channel, num, *pidit)) { + if (ustcmd_set_subbuf_num(trace, channel, num, *pidit)) { ERR("error while trying to set the number of subbuffers with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -420,7 +422,7 @@ int main(int argc, char *argv[]) break; case GET_SUBBUF_SIZE: - result = ustcmd_get_subbuf_size(opts.regex, *pidit); + result = ustcmd_get_subbuf_size(trace, opts.regex, *pidit); if (result == -1) { ERR("error while trying to get_subuf_size with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -431,7 +433,7 @@ int main(int argc, char *argv[]) break; case GET_SUBBUF_NUM: - result = ustcmd_get_subbuf_num(opts.regex, *pidit); + result = ustcmd_get_subbuf_num(trace, opts.regex, *pidit); if (result == -1) { ERR("error while trying to get_subuf_num with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; @@ -442,7 +444,7 @@ int main(int argc, char *argv[]) break; case ALLOC_TRACE: - result = ustcmd_alloc_trace(*pidit); + result = ustcmd_alloc_trace(trace, *pidit); if (result) { ERR("error while trying to alloc trace with PID %u\n", (unsigned int) *pidit); retval = EXIT_FAILURE; -- 1.7.1 _______________________________________________ ltt-dev mailing list [email protected] http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
