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 <nils.carlson@ericsson.com>
pthread_mutex_unlock(&listen_sock_mutex);
}
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. */
}
/* Simple commands are those which need only respond with a return value. */
return setenv("UST_DAEMON_SOCKET", sock_msg->field, 1);
}
return setenv("UST_DAEMON_SOCKET", sock_msg->field, 1);
}
- case FORCE_SUBBUF_SWITCH:
- /* FIXME: return codes? */
- force_subbuf_switch();
-
- break;
-
default:
return -EINVAL;
}
default:
return -EINVAL;
}
return result;
}
return 0;
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;
case START_TRACE:
case STOP_TRACE:
case DESTROY_TRACE:
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;
{
struct ustcomm_single_field *trace_inf =
(struct ustcomm_single_field *)recv_buf;
return do_trace_cmd(sock, trace, ALLOC_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.
*
/**
* Stops an UST trace according to a PID.
*
-
-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);
-}