X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libust%2Ftracectl.c;h=f59edd35902eacd94c7b8c52bbead9f397a753d5;hb=1a9dbd91d1714133deacf8e531cd3bfcd443eb39;hp=830e777bb5114391e7525ca6713b138219125f38;hpb=1d7304a3f27fd639b513415c27b759e133e3d484;p=ust.git diff --git a/libust/tracectl.c b/libust/tracectl.c index 830e777..f59edd3 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -558,47 +558,32 @@ 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; - - cds_list_for_each_entry(buf, &open_buffers_list, - open_buffers_list) { - ltt_force_switch(buf, FORCE_FLUSH); - } -} + struct ust_trace *trace; + int i, j, retval = 0; -/* 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; + 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; + } - switch(command) { - case SET_SOCK_PATH: - { - struct ustcomm_single_field *sock_msg; - sock_msg = (struct ustcomm_single_field *)recv_buf; - result = ustcomm_unpack_single_field(sock_msg); - if (result < 0) { - return result; + 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); } - return setenv("UST_DAEMON_SOCKET", sock_msg->field, 1); } - case FORCE_SUBBUF_SWITCH: - /* FIXME: return codes? */ - force_subbuf_switch(); - - break; - - default: - return -EINVAL; - } +unlock_traces: + ltt_unlock_traces(); - return 0; + return retval; } - static int process_trace_cmd(int command, char *trace_name) { int result; @@ -716,6 +701,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; @@ -1041,6 +1035,21 @@ static void process_client_cmd(struct ustcomm_header *recv_header, goto send_response; } + case SET_SOCK_PATH: + { + struct ustcomm_single_field *sock_msg; + sock_msg = (struct ustcomm_single_field *)recv_buf; + result = ustcomm_unpack_single_field(sock_msg); + if (result < 0) { + reply_header->result = -EINVAL; + goto send_response; + } + + reply_header->result = setenv("UST_DAEMON_SOCKET", + sock_msg->field, 1); + + goto send_response; + } case START: case SETUP_TRACE: case ALLOC_TRACE: @@ -1048,6 +1057,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; @@ -1066,11 +1076,9 @@ static void process_client_cmd(struct ustcomm_header *recv_header, } default: - reply_header->result = - process_simple_client_cmd(recv_header->command, - recv_buf); - goto send_response; + reply_header->result = -EINVAL; + goto send_response; } return;