Change force_subbuffer switch to be per trace
authorNils Carlson <nils.carlson@ericsson.com>
Thu, 10 Mar 2011 09:58:44 +0000 (10:58 +0100)
committerNils Carlson <nils.carlson@ericsson.com>
Thu, 10 Mar 2011 09:58:44 +0000 (10:58 +0100)
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>
libust/tracectl.c
libustctl/libustctl.c

index 830e777bb5114391e7525ca6713b138219125f38..463edb6b492897546a84cf3161c07c680a12eb10 100644 (file)
@@ -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;
index e9709c574e0bbe1e2b82a0b27e784288b5e8ec67..d57e6458b047a1d4c82353b331be4a8ac89fac79 100644 (file)
@@ -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);
-}
This page took 0.027495 seconds and 4 git commands to generate.