From e005efaa25bb1c65019e147e5290733cf5e0c82d Mon Sep 17 00:00:00 2001 From: Nils Carlson Date: Thu, 10 Mar 2011 10:58:44 +0100 Subject: [PATCH] Change force_subbuffer switch to be per trace Change force_subbuffer switch to act on a per trace basis becuase this is what we want almost all the time. This will simplify periodic flushing of some traces and other features we might want in the future. Signed-off-by: Nils Carlson --- libust/tracectl.c | 42 +++++++++++++++++++++++++++++++----------- libustctl/libustctl.c | 16 ++++++---------- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/libust/tracectl.c b/libust/tracectl.c index 830e777..463edb6 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -558,14 +558,30 @@ static void listener_cleanup(void *ptr) pthread_mutex_unlock(&listen_sock_mutex); } -static void force_subbuf_switch() +static int force_subbuf_switch(const char *trace_name) { - struct ust_buffer *buf; + struct ust_trace *trace; + int i, j, retval = 0; + + ltt_lock_traces(); + trace = _ltt_trace_find(trace_name); + if (!trace) { + retval = -ENODATA; + DBG("Cannot find trace. It was likely destroyed by the user."); + goto unlock_traces; + } - cds_list_for_each_entry(buf, &open_buffers_list, - open_buffers_list) { - ltt_force_switch(buf, FORCE_FLUSH); + for (i = 0; i < trace->nr_channels; i++) { + for (j = 0; j < trace->channels[i].n_cpus; j++) { + ltt_force_switch(trace->channels[i].buf[j], + FORCE_FLUSH); + } } + +unlock_traces: + ltt_unlock_traces(); + + return retval; } /* Simple commands are those which need only respond with a return value. */ @@ -585,12 +601,6 @@ static int process_simple_client_cmd(int command, char *recv_buf) return setenv("UST_DAEMON_SOCKET", sock_msg->field, 1); } - case FORCE_SUBBUF_SWITCH: - /* FIXME: return codes? */ - force_subbuf_switch(); - - break; - default: return -EINVAL; } @@ -716,6 +726,15 @@ static int process_trace_cmd(int command, char *trace_name) return result; } return 0; + case FORCE_SUBBUF_SWITCH: + DBG("force switch"); + + result = force_subbuf_switch(trace_name); + if (result < 0) { + ERR("force_subbuf_switch failed"); + return result; + } + return 0; } return 0; @@ -1048,6 +1067,7 @@ static void process_client_cmd(struct ustcomm_header *recv_header, case START_TRACE: case STOP_TRACE: case DESTROY_TRACE: + case FORCE_SUBBUF_SWITCH: { struct ustcomm_single_field *trace_inf = (struct ustcomm_single_field *)recv_buf; diff --git a/libustctl/libustctl.c b/libustctl/libustctl.c index e9709c5..d57e645 100644 --- a/libustctl/libustctl.c +++ b/libustctl/libustctl.c @@ -379,6 +379,12 @@ int ustctl_alloc_trace(int sock, const char *trace) return do_trace_cmd(sock, trace, ALLOC_TRACE); } + +int ustctl_force_switch(int sock, const char *trace) +{ + return do_trace_cmd(sock, trace, FORCE_SUBBUF_SWITCH); +} + /** * Stops an UST trace according to a PID. * @@ -647,13 +653,3 @@ int ustctl_get_sock_path(int sock, char **sock_path) return 0; } - -int ustctl_force_switch(int sock, const char *trace) -{ - struct ustcomm_header req_header, res_header; - - req_header.command = FORCE_SUBBUF_SWITCH; - req_header.size = 0; - - return do_cmd(sock, &req_header, NULL, &res_header, NULL); -} -- 2.34.1