Make option type OPTIONAL_ARG available
authorBenjamin Poirier <benjamin.poirier@polymtl.ca>
Thu, 26 Nov 2009 18:43:30 +0000 (13:43 -0500)
committerBenjamin Poirier <benjamin.poirier@polymtl.ca>
Fri, 18 Dec 2009 19:04:17 +0000 (14:04 -0500)
These options are not be supported by Lttv and will be ignored (with a warning
message).

Signed-off-by: Benjamin Poirier <benjamin.poirier@polymtl.ca>
lttv/lttv/sync/event_analysis_eval.c
lttv/lttv/sync/event_processing.h
lttv/lttv/sync/sync_chain.c
lttv/lttv/sync/sync_chain.h
lttv/lttv/sync/sync_chain_lttv.c

index 29b1b4493009eabdb2552174a81d289689e1462b..3c3f8636398ec5ddb657a80665aa758d1a57bbfe 100644 (file)
@@ -150,7 +150,6 @@ static AnalysisModule analysisModuleEval= {
 static ModuleOption optionEvalRttFile= {
        .longName= "eval-rtt-file",
        .hasArg= REQUIRED_ARG,
-       {.arg= NULL},
        .optionHelp= "specify the file containing RTT information",
        .argHelp= "FILE",
 };
index 34ea8001d4ec798f22b9000257601afc513943ff..2ac26ae20effa67cd4da114d6b11c766294f5e68 100644 (file)
@@ -33,9 +33,9 @@ typedef struct
        char* name;
 
        void (*initProcessing)(struct _SyncState* const syncStateLttv, ...);
-       void (*destroyProcessing)(struct _SyncState* const syncState);
        void (*finalizeProcessing)(struct _SyncState* const syncState);
        void (*printProcessingStats)(struct _SyncState* const syncState);
+       void (*destroyProcessing)(struct _SyncState* const syncState);
        GraphFunctions graphFunctions;
 } ProcessingModule;
 
index e65415971f6f148ad7c308a821ce8525dc4b5716..0d9773fac75633eb0cd1b82beb45edaf8d3a407c 100644 (file)
@@ -122,3 +122,19 @@ gint gcfCompareAnalysis(gconstpointer a, gconstpointer b)
        return strncmp(analysisModule->name, name, strlen(analysisModule->name) +
                1);
 }
+
+
+/*
+ * A GFunc for g_queue_foreach()
+ *
+ * Concatenate analysis module names.
+ *
+ * Args:
+ *   data:         AnalysisModule*
+ *   user_data:    GString*, concatenated names
+ */
+void gfAppendAnalysisName(gpointer data, gpointer user_data)
+{
+       g_string_append((GString*) user_data, ((AnalysisModule*) data)->name);
+       g_string_append((GString*) user_data, ", ");
+}
index 852e8e4a0ad855f448f6ee210e3dd23534ca0541..d187b30402c14f79cbe33c1aed605659594436dc 100644 (file)
@@ -43,18 +43,18 @@ typedef struct _SyncState
 
 typedef struct
 {
+       const char shortName;
        const char* longName;
        enum {
                NO_ARG,
                REQUIRED_ARG,
-               //OPTIONAL_ARG, // Not yet implemented because not supported by LTTV
+               OPTIONAL_ARG,
                HAS_ARG_COUNT // This must be the last field
        } hasArg;
-       union
-       {
-               bool present;
-               const char* arg;
-       };
+       bool present;
+       // in the case of OPTIONAL_ARG, arg can be initialized to a default value.
+       // If an argument is present, arg will be modified
+       const char* arg;
        const char* optionHelp;
        const char* argHelp;
 } ModuleOption;
@@ -71,5 +71,6 @@ void timeDiff(struct timeval* const end, const struct timeval* const start);
 gint gcfCompareProcessing(gconstpointer a, gconstpointer b);
 gint gcfCompareMatching(gconstpointer a, gconstpointer b);
 gint gcfCompareAnalysis(gconstpointer a, gconstpointer b);
+void gfAppendAnalysisName(gpointer data, gpointer user_data);
 
 #endif
index 5dd10bf9fb827deaa5ea6ea1777a2cee4a955b82..bbd2b3aacb9b9d70b65f363722b15bfc40687406 100644 (file)
 static void init();
 static void destroy();
 
-static void gfAppendAnalysisName(gpointer data, gpointer user_data);
 static void gfAddModuleOption(gpointer data, gpointer user_data);
 static void gfRemoveModuleOption(gpointer data, gpointer user_data);
 
-static char* argHelpNone= "none";
 static ModuleOption optionSync= {
        .longName= "sync",
        .hasArg= NO_ARG,
-       {.present= false},
        .optionHelp= "synchronize the time between the traces",
 };
-static char graphsDir[20];
 static ModuleOption optionSyncStats= {
        .longName= "sync-stats",
        .hasArg= NO_ARG,
-       {.present= false},
        .optionHelp= "print statistics about the time synchronization",
 };
 static ModuleOption optionSyncNull= {
        .longName= "sync-null",
        .hasArg= NO_ARG,
-       {.present= false},
        .optionHelp= "read the events but do not perform any processing",
 };
 static GString* analysisModulesNames;
@@ -73,15 +67,16 @@ static ModuleOption optionSyncAnalysis= {
 static ModuleOption optionSyncGraphs= {
        .longName= "sync-graphs",
        .hasArg= NO_ARG,
-       {.present= false},
        .optionHelp= "output gnuplot graph showing synchronization points",
 };
+static char graphsDir[20];
 static ModuleOption optionSyncGraphsDir= {
        .longName= "sync-graphs-dir",
        .hasArg= REQUIRED_ARG,
        .optionHelp= "specify the directory where to store the graphs",
 };
 
+
 /*
  * Module init function
  *
@@ -100,7 +95,7 @@ static void init()
        g_debug("Sync init");
 
        g_assert(g_queue_get_length(&analysisModules) > 0);
-       optionSyncAnalysis.arg = ((AnalysisModule*)
+       optionSyncAnalysis.arg= ((AnalysisModule*)
                g_queue_peek_head(&analysisModules))->name;
        analysisModulesNames= g_string_new("");
        g_queue_foreach(&analysisModules, &gfAppendAnalysisName,
@@ -125,7 +120,6 @@ static void init()
        g_queue_push_head(&moduleOptions, &optionSync);
 
        g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL);
-
 }
 
 
@@ -320,22 +314,6 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
 }
 
 
-/*
- * A GFunc for g_queue_foreach()
- *
- * Concatenate analysis module names.
- *
- * Args:
- *   data:         AnalysisModule*
- *   user_data:    GString*, concatenated names
- */
-static void gfAppendAnalysisName(gpointer data, gpointer user_data)
-{
-       g_string_append((GString*) user_data, ((AnalysisModule*) data)->name);
-       g_string_append((GString*) user_data, ", ");
-}
-
-
 /*
  * A GFunc for g_queue_foreach()
  *
@@ -345,18 +323,33 @@ static void gfAppendAnalysisName(gpointer data, gpointer user_data)
  */
 static void gfAddModuleOption(gpointer data, gpointer user_data)
 {
-       ModuleOption* option;
+       ModuleOption* option= data;
        LttvOptionType conversion[]= {
                [NO_ARG]= LTTV_OPT_NONE,
+               [OPTIONAL_ARG]= LTTV_OPT_NONE,
                [REQUIRED_ARG]= LTTV_OPT_STRING,
        };
+       size_t fieldOffset[]= {
+               [NO_ARG]= offsetof(ModuleOption, present),
+               [REQUIRED_ARG]= offsetof(ModuleOption, arg),
+       };
+       static const char* argHelpNone= "none";
 
        g_assert_cmpuint(sizeof(conversion) / sizeof(*conversion), ==,
                HAS_ARG_COUNT);
-       option= (ModuleOption*) data;
-       lttv_option_add(option->longName, '\0', option->optionHelp,
-               option->argHelp ? option->argHelp : argHelpNone,
-               conversion[option->hasArg], &option->arg, NULL, NULL);
+       if (option->hasArg == OPTIONAL_ARG)
+       {
+               g_warning("Parameters with optional arguments not supported by the "
+                       "lttv option scheme, parameter '%s' will not be available",
+                       option->longName);
+       }
+       else
+       {
+               lttv_option_add(option->longName, '\0', option->optionHelp,
+                       option->argHelp ? option->argHelp : argHelpNone,
+                       conversion[option->hasArg], (void*) option + fieldOffset[option->hasArg],
+                       NULL, NULL);
+       }
 }
 
 
This page took 0.0279 seconds and 4 git commands to generate.