summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2f07659)
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>
static ModuleOption optionEvalRttFile= {
.longName= "eval-rtt-file",
.hasArg= REQUIRED_ARG,
static ModuleOption optionEvalRttFile= {
.longName= "eval-rtt-file",
.hasArg= REQUIRED_ARG,
.optionHelp= "specify the file containing RTT information",
.argHelp= "FILE",
};
.optionHelp= "specify the file containing RTT information",
.argHelp= "FILE",
};
char* name;
void (*initProcessing)(struct _SyncState* const syncStateLttv, ...);
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 (*finalizeProcessing)(struct _SyncState* const syncState);
void (*printProcessingStats)(struct _SyncState* const syncState);
+ void (*destroyProcessing)(struct _SyncState* const syncState);
GraphFunctions graphFunctions;
} ProcessingModule;
GraphFunctions graphFunctions;
} ProcessingModule;
return strncmp(analysisModule->name, name, strlen(analysisModule->name) +
1);
}
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, ", ");
+}
const char* longName;
enum {
NO_ARG,
REQUIRED_ARG,
const char* longName;
enum {
NO_ARG,
REQUIRED_ARG,
- //OPTIONAL_ARG, // Not yet implemented because not supported by LTTV
HAS_ARG_COUNT // This must be the last field
} hasArg;
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;
const char* optionHelp;
const char* argHelp;
} ModuleOption;
gint gcfCompareProcessing(gconstpointer a, gconstpointer b);
gint gcfCompareMatching(gconstpointer a, gconstpointer b);
gint gcfCompareAnalysis(gconstpointer a, gconstpointer b);
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);
static void init();
static void destroy();
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 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,
static ModuleOption optionSync= {
.longName= "sync",
.hasArg= NO_ARG,
.optionHelp= "synchronize the time between the traces",
};
.optionHelp= "synchronize the time between the traces",
};
-static char graphsDir[20];
static ModuleOption optionSyncStats= {
.longName= "sync-stats",
.hasArg= NO_ARG,
static ModuleOption optionSyncStats= {
.longName= "sync-stats",
.hasArg= NO_ARG,
.optionHelp= "print statistics about the time synchronization",
};
static ModuleOption optionSyncNull= {
.longName= "sync-null",
.hasArg= NO_ARG,
.optionHelp= "print statistics about the time synchronization",
};
static ModuleOption optionSyncNull= {
.longName= "sync-null",
.hasArg= NO_ARG,
.optionHelp= "read the events but do not perform any processing",
};
static GString* analysisModulesNames;
.optionHelp= "read the events but do not perform any processing",
};
static GString* analysisModulesNames;
static ModuleOption optionSyncGraphs= {
.longName= "sync-graphs",
.hasArg= NO_ARG,
static ModuleOption optionSyncGraphs= {
.longName= "sync-graphs",
.hasArg= NO_ARG,
.optionHelp= "output gnuplot graph showing synchronization points",
};
.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",
};
static ModuleOption optionSyncGraphsDir= {
.longName= "sync-graphs-dir",
.hasArg= REQUIRED_ARG,
.optionHelp= "specify the directory where to store the graphs",
};
/*
* Module init function
*
/*
* Module init function
*
g_debug("Sync init");
g_assert(g_queue_get_length(&analysisModules) > 0);
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,
g_queue_peek_head(&analysisModules))->name;
analysisModulesNames= g_string_new("");
g_queue_foreach(&analysisModules, &gfAppendAnalysisName,
g_queue_push_head(&moduleOptions, &optionSync);
g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL);
g_queue_push_head(&moduleOptions, &optionSync);
g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL);
-/*
- * 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()
*
/*
* A GFunc for g_queue_foreach()
*
*/
static void gfAddModuleOption(gpointer data, gpointer user_data)
{
*/
static void gfAddModuleOption(gpointer data, gpointer user_data)
{
+ ModuleOption* option= data;
LttvOptionType conversion[]= {
[NO_ARG]= LTTV_OPT_NONE,
LttvOptionType conversion[]= {
[NO_ARG]= LTTV_OPT_NONE,
+ [OPTIONAL_ARG]= LTTV_OPT_NONE,
[REQUIRED_ARG]= LTTV_OPT_STRING,
};
[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);
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);
+ }