Module: xenomai-3
Branch: next
Commit: b411e4c1129aa3c1917f5113440317eb2fddacb7
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=b411e4c1129aa3c1917f5113440317eb2fddacb7

Author: Philippe Gerum <r...@xenomai.org>
Date:   Mon Jan 18 15:50:57 2016 +0100

lib/boilerplate: add --trace to the base option set

This option sets tracing to the desired level. The level argument may
be interpreted differently depending on the application, however
--trace=0 must disable tracing. Level 1 allows tracing the Xenomai
library bootstrap code.

The interpretation of higher levels are application-specific. Defaults
to 0.

---

 include/boilerplate/setup.h    |    9 +++++++++
 include/boilerplate/tunables.h |   14 ++++++++++++--
 lib/boilerplate/setup.c        |   36 ++++++++++++++++++++++++++++++++++--
 3 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/include/boilerplate/setup.h b/include/boilerplate/setup.h
index e99a9b1..5a18f6a 100644
--- a/include/boilerplate/setup.h
+++ b/include/boilerplate/setup.h
@@ -28,6 +28,7 @@ struct base_setup_data {
        int no_mlock;
        int no_sanity;
        int verbosity_level;
+       int trace_level;
        const char *arg0;
 };
 
@@ -106,6 +107,14 @@ static inline const char *get_program_name(void)
        return basename(__base_setup_data.arg0 ?: "program");
 }
 
+void __trace_me(const char *fmt, ...);
+
+#define trace_me(__fmt, __args...)                     \
+       do {                                            \
+               if (__base_setup_data.trace_level > 0)  \
+                       __trace_me(__fmt, ##__args);    \
+       } while (0)
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/include/boilerplate/tunables.h b/include/boilerplate/tunables.h
index 628b312..db8523b 100644
--- a/include/boilerplate/tunables.h
+++ b/include/boilerplate/tunables.h
@@ -99,9 +99,9 @@ static inline read_config_tunable(no_sanity, int)
        return __base_setup_data.no_sanity;
 }
 
-static inline define_runtime_tunable(verbosity_level, int, mode)
+static inline define_runtime_tunable(verbosity_level, int, level)
 {
-       __base_setup_data.verbosity_level = mode;
+       __base_setup_data.verbosity_level = level;
 }
 
 static inline read_runtime_tunable(verbosity_level, int)
@@ -109,6 +109,16 @@ static inline read_runtime_tunable(verbosity_level, int)
        return __base_setup_data.verbosity_level;
 }
 
+static inline define_runtime_tunable(trace_level, int, level)
+{
+       __base_setup_data.trace_level = level;
+}
+
+static inline read_runtime_tunable(trace_level, int)
+{
+       return __base_setup_data.trace_level;
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/boilerplate/setup.c b/lib/boilerplate/setup.c
index 1cc66a7..7a9334d 100644
--- a/lib/boilerplate/setup.c
+++ b/lib/boilerplate/setup.c
@@ -25,6 +25,7 @@
 #include <unistd.h>
 #include <memory.h>
 #include <malloc.h>
+#include <stdarg.h>
 #include <stdio.h>
 #include <assert.h>
 #include <xeno_config.h>
@@ -36,6 +37,7 @@
 struct base_setup_data __base_setup_data = {
        .no_sanity = !CONFIG_XENO_SANITY,
        .verbosity_level = 1,
+       .trace_level = 0,
        .arg0 = NULL,
        .no_mlock = 0,
 };
@@ -101,7 +103,12 @@ static const struct option base_options[] = {
                .flag = &__base_setup_data.no_sanity,
        },
        {
-#define no_mlock_opt   9
+#define trace_opt      9
+               .name = "trace",
+               .has_arg = optional_argument,
+       },
+       {
+#define no_mlock_opt   10
 #ifdef CONFIG_XENO_MERCURY
                .name = "no-mlock",
                .has_arg = no_argument,
@@ -310,8 +317,9 @@ void xenomai_usage(void)
 
         fprintf(stderr, "--cpu-affinity=<cpu[,cpu]...> set CPU affinity of 
threads\n");
         fprintf(stderr, "--[no-]sanity                 disable/enable sanity 
checks\n");
-        fprintf(stderr, "--verbose[=level]             set verbosity to 
desired level\n");
+        fprintf(stderr, "--verbose[=level]             set verbosity to 
desired level [=1]\n");
         fprintf(stderr, "--silent, --quiet             same as --verbose=0\n");
+        fprintf(stderr, "--trace[=level]               set tracing to desired 
level [=1]\n");
         fprintf(stderr, "--version                     get version 
information\n");
         fprintf(stderr, "--dump-config                 dump configuration 
settings\n");
 #ifdef CONFIG_XENO_MERCURY
@@ -369,6 +377,11 @@ static int parse_base_options(int *argcp, char *const 
**argvp,
                        if (optarg)
                                __base_setup_data.verbosity_level = 
atoi(optarg);
                        break;
+               case trace_opt:
+                       __base_setup_data.trace_level = 1;
+                       if (optarg)
+                               __base_setup_data.trace_level = atoi(optarg);
+                       break;
                case silent_opt:
                case quiet_opt:
                case no_mlock_opt:
@@ -436,6 +449,7 @@ static int parse_setup_options(int *argcp, int largc, char 
**uargv,
                            lindex >= setup->__reserved.opt_end)
                                continue;
                        lindex -= setup->__reserved.opt_start;
+                       trace_me("%s->parse_options()", setup->name);
                        ret = setup->parse_option(lindex, optarg);
                        if (ret == 0)
                                break;
@@ -496,6 +510,8 @@ void xenomai_init(int *argcp, char *const **argvp)
        if (ret)
                goto fail;
 
+       trace_me("%s() running", __func__);
+
 #ifndef CONFIG_SMP
        if (__base_setup_data.no_sanity == 0) {
                ret = get_static_cpu_count();
@@ -514,6 +530,7 @@ void xenomai_init(int *argcp, char *const **argvp)
                        goto fail;
                }
        }
+       trace_me("memory locked");
 #endif
 
        /*
@@ -527,6 +544,7 @@ void xenomai_init(int *argcp, char *const **argvp)
 
                pvlist_for_each_entry(setup, &setup_list, __reserved.next) {
                        if (setup->tune) {
+                               trace_me("%s->tune()", setup->name);
                                ret = setup->tune();
                                if (ret)
                                        break;
@@ -545,6 +563,7 @@ void xenomai_init(int *argcp, char *const **argvp)
        
                pvlist_for_each_entry(setup, &setup_list, __reserved.next) {
                        if (setup->init) {
+                               trace_me("%s->init()", setup->name);
                                ret = setup->init();
                                if (ret)
                                        break;
@@ -583,12 +602,25 @@ void xenomai_init(int *argcp, char *const **argvp)
         */
        *argvp = uargv;
        init_done = 1;
+       trace_me("initialization complete");
 
        return;
 fail:
        early_panic("initialization failed, %s", symerror(ret));
 }
 
+void __trace_me(const char *fmt, ...)
+{
+       va_list ap;
+
+       va_start(ap, fmt);
+       fprintf(stderr, "--  ");
+       vfprintf(stderr, fmt, ap);
+       fputc('\n', stderr);
+       fflush(stderr);
+       va_end(ap);
+}
+
 void __register_setup_call(struct setup_descriptor *p, int id)
 {
        struct setup_descriptor *pos;


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to