* [ltt-dev] [UST PATCH] Add trace name to ustcomm structs and push trace name to ustctl
@ 2010-11-01 8:57 Nils Carlson
2010-11-02 16:43 ` David Goulet
0 siblings, 1 reply; 3+ messages in thread
From: Nils Carlson @ 2010-11-01 8:57 UTC (permalink / raw)
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 <nils.carlson at ericsson.com>
---
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* [ltt-dev] [UST PATCH] Add trace name to ustcomm structs and push trace name to ustctl
2010-11-01 8:57 [ltt-dev] [UST PATCH] Add trace name to ustcomm structs and push trace name to ustctl Nils Carlson
@ 2010-11-02 16:43 ` David Goulet
2010-11-04 19:16 ` Nils Carlson
0 siblings, 1 reply; 3+ messages in thread
From: David Goulet @ 2010-11-02 16:43 UTC (permalink / raw)
Hmmm, for what I can see, this patch add something else. I wonder if we
should maybe separate this patch into two? I'm talking about the
do_trace_cmd function and ustcomm_pack_trace_info that are yes related
to the addition of trace name but maybe a first patch adding these two
functions and then the trace name ?
I don't want to make your life harder :P but I've been told too many
times that ;) (thanks Mathieu :D).
What do you think?
David
On 10-11-01 04:57 AM, Nils Carlson wrote:
> 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<nils.carlson at ericsson.com>
> ---
> 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;
--
David Goulet
LTTng project, DORSAL Lab.
PGP/GPG : 1024D/16BD8563
BE3C 672B 9331 9796 291A 14C6 4AF7 C14B 16BD 8563
^ permalink raw reply [flat|nested] 3+ messages in thread
* [ltt-dev] [UST PATCH] Add trace name to ustcomm structs and push trace name to ustctl
2010-11-02 16:43 ` David Goulet
@ 2010-11-04 19:16 ` Nils Carlson
0 siblings, 0 replies; 3+ messages in thread
From: Nils Carlson @ 2010-11-04 19:16 UTC (permalink / raw)
On Nov 2, 2010, at 5:43 PM, David Goulet wrote:
> Hmmm, for what I can see, this patch add something else. I wonder if
> we should maybe separate this patch into two? I'm talking about the
> do_trace_cmd function and ustcomm_pack_trace_info that are yes
> related to the addition of trace name but maybe a first patch adding
> these two functions and then the trace name ?
>
> I don't want to make your life harder :P but I've been told too many
> times that ;) (thanks Mathieu :D).
>
> What do you think?
>
I think discipline is good. But then again I spent two years in the
military, so perhaps I got a bit damaged. :-P
Now you have three patches instead. :-)
/Nils
> David
>
> On 10-11-01 04:57 AM, Nils Carlson wrote:
>> 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<nils.carlson at ericsson.com>
>> ---
>> 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;
>
> --
> David Goulet
> LTTng project, DORSAL Lab.
>
> PGP/GPG : 1024D/16BD8563
> BE3C 672B 9331 9796 291A 14C6 4AF7 C14B 16BD 8563
>
> _______________________________________________
> ltt-dev mailing list
> ltt-dev at lists.casi.polymtl.ca
> http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-11-04 19:16 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-11-01 8:57 [ltt-dev] [UST PATCH] Add trace name to ustcomm structs and push trace name to ustctl Nils Carlson
2010-11-02 16:43 ` David Goulet
2010-11-04 19:16 ` Nils Carlson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox