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. */
return setenv("UST_DAEMON_SOCKET", sock_msg->field, 1);
}
- case FORCE_SUBBUF_SWITCH:
- /* FIXME: return codes? */
- force_subbuf_switch();
-
- break;
-
default:
return -EINVAL;
}
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;
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;
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.
*
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);
-}