This simple patch make the above-mentioned commands independent from 'record'.
The point of doing so is to follow the convention of one entry-point per command
that is followed by most of trace-cmd's code. Ultimately that aims to prevent
the complexity to concentrate in a single point, making the code simpler to
maintain.

Signed-off-by: Vladislav Valtchev (VMware) <vladislav.valtc...@gmail.com>
---
 trace-cmd.c    |   8 ++---
 trace-local.h  |   8 +++++
 trace-record.c | 102 +++++++++++++++++++++++++++++++++++++--------------------
 3 files changed, 78 insertions(+), 40 deletions(-)

diff --git a/trace-cmd.c b/trace-cmd.c
index 7bab476..7297756 100644
--- a/trace-cmd.c
+++ b/trace-cmd.c
@@ -102,11 +102,11 @@ struct command commands[] = {
        {"stack", trace_stack},
        {"check-events", trace_check_events},
        {"record", trace_record},
-       {"start", trace_record},
-       {"extract", trace_record},
+       {"start", trace_start},
+       {"extract", trace_extract},
        {"stop", trace_stop},
-       {"stream", trace_record},
-       {"profile", trace_record},
+       {"stream", trace_stream},
+       {"profile", trace_profile},
        {"restart", trace_restart},
        {"reset", trace_reset},
        {"stat", trace_stat},
diff --git a/trace-local.h b/trace-local.h
index 83c794a..cb47e78 100644
--- a/trace-local.h
+++ b/trace-local.h
@@ -64,6 +64,14 @@ void trace_restart(int argc, char **argv);
 
 void trace_reset(int argc, char **argv);
 
+void trace_start(int argc, char **argv);
+
+void trace_extract(int argc, char **argv);
+
+void trace_stream(int argc, char **argv);
+
+void trace_profile(int argc, char **argv);
+
 void trace_report(int argc, char **argv);
 
 void trace_split(int argc, char **argv);
diff --git a/trace-record.c b/trace-record.c
index 916b768..ae0733a 100644
--- a/trace-record.c
+++ b/trace-record.c
@@ -4732,28 +4732,17 @@ static void parse_record_options(int argc,
                            "Did you mean 'record'?");
                ctx->run_command = 1;
        }
-
-}
-
-static void init_common_record_context(struct common_record_context *ctx)
-{
-       memset(ctx, 0, sizeof(*ctx));
-       ctx->instance = &top_instance;
-       cpu_count = count_cpus();
 }
 
+/*
+ * This function contains common code for the following commands:
+ * record, start, extract, stream, profile.
+ */
 static void record_trace(int argc, char **argv,
                         struct common_record_context *ctx)
 {
        enum trace_type type = 0;
 
-       /*
-        * If this is a profile run, and no instances were set,
-        * then enable profiling on the top instance.
-        */
-       if (IS_PROFILE(ctx) && !buffer_instances)
-               top_instance.profile = 1;
-
        /*
         * If top_instance doesn't have any plugins or events, then
         * remove it from being processed.
@@ -4903,7 +4892,7 @@ static void record_trace(int argc, char **argv,
        destroy_stats();
 
        if (keep)
-               exit(0);
+               return;
 
        update_reset_files();
        update_reset_triggers();
@@ -4923,10 +4912,67 @@ static void record_trace(int argc, char **argv,
 
        if (host)
                tracecmd_output_close(network_handle);
+}
 
-       if (IS_PROFILE(ctx))
-               trace_profile_int();
+static void init_common_record_context(struct common_record_context *ctx,
+                                      enum trace_cmd curr_cmd)
+{
+       memset(ctx, 0, sizeof(*ctx));
+       ctx->instance = &top_instance;
+       ctx->curr_cmd = curr_cmd;
+       init_instance(ctx->instance);
+       cpu_count = count_cpus();
+}
 
+void trace_start(int argc, char **argv)
+{
+       struct common_record_context ctx;
+
+       init_common_record_context(&ctx, CMD_start);
+       parse_record_options(argc, argv, &ctx);
+       record_trace(argc, argv, &ctx);
+       exit(0);
+}
+
+void trace_extract(int argc, char **argv)
+{
+       struct common_record_context ctx;
+
+       init_common_record_context(&ctx, CMD_extract);
+       parse_record_options(argc, argv, &ctx);
+       record_trace(argc, argv, &ctx);
+       exit(0);
+}
+
+void trace_stream(int argc, char **argv)
+{
+       struct common_record_context ctx;
+
+       init_common_record_context(&ctx, CMD_stream);
+       parse_record_options(argc, argv, &ctx);
+       record_trace(argc, argv, &ctx);
+       exit(0);
+}
+
+void trace_profile(int argc, char **argv)
+{
+       struct common_record_context ctx;
+
+       init_common_record_context(&ctx, CMD_profile);
+
+       handle_init = trace_init_profile;
+       ctx.events = 1;
+
+       parse_record_options(argc, argv, &ctx);
+
+       /*
+        * If no instances were set, then enable profiling on the top instance.
+        */
+       if (!buffer_instances)
+               top_instance.profile = 1;
+
+       record_trace(argc, argv, &ctx);
+       trace_profile_int();
        exit(0);
 }
 
@@ -4934,24 +4980,8 @@ void trace_record(int argc, char **argv)
 {
        struct common_record_context ctx;
 
-       init_common_record_context(&ctx);
-       init_instance(ctx.instance);
-
-       if (strcmp(argv[1], "record") == 0)
-               ctx.curr_cmd = CMD_record;
-       else if (strcmp(argv[1], "start") == 0)
-               ctx.curr_cmd = CMD_start;
-       else if (strcmp(argv[1], "extract") == 0)
-               ctx.curr_cmd = CMD_extract;
-       else if (strcmp(argv[1], "stream") == 0)
-               ctx.curr_cmd = CMD_stream;
-       else if (strcmp(argv[1], "profile") == 0) {
-               ctx.curr_cmd = CMD_profile;
-               handle_init = trace_init_profile;
-               ctx.events = 1;
-       } else
-               usage(argv);
-
+       init_common_record_context(&ctx, CMD_record);
        parse_record_options(argc, argv, &ctx);
        record_trace(argc, argv, &ctx);
+       exit(0);
 }
-- 
2.14.1

Reply via email to