X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fsync_chain_lttv.c;h=9652f346328da0f6138f10bed0107ecbe1a82468;hb=2bd4b3e43e525da7b4c9738915ec847f7fe4906a;hp=2479512fed5ddb083ef170fabda3b154f56199d7;hpb=f6691532b67cb6911749118e3da8d74de876380c;p=lttv.git diff --git a/lttv/lttv/sync/sync_chain_lttv.c b/lttv/lttv/sync/sync_chain_lttv.c index 2479512f..9652f346 100644 --- a/lttv/lttv/sync/sync_chain_lttv.c +++ b/lttv/lttv/sync/sync_chain_lttv.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -34,7 +33,7 @@ #include #include -#include "sync_chain_lttv.h" +#include "sync_chain.h" #ifndef g_info @@ -45,24 +44,52 @@ static void init(); static void destroy(); -static void timeDiff(struct timeval* const end, const struct timeval* const start); - -static gint gcfCompareAnalysis(gconstpointer a, gconstpointer b); -static gint gcfCompareProcessing(gconstpointer a, gconstpointer b); static void gfAppendAnalysisName(gpointer data, gpointer user_data); - -static gboolean optionSync; -static gboolean optionSyncStats; -static gboolean optionSyncNull; -static char* optionSyncAnalysis; -static gboolean optionSyncGraphs; -static char* optionSyncGraphsDir; -static char graphsDir[20]; +static void gfAddModuleOption(gpointer data, gpointer user_data); +static void gfRemoveModuleOption(gpointer data, gpointer user_data); GQueue processingModules= G_QUEUE_INIT; GQueue matchingModules= G_QUEUE_INIT; GQueue analysisModules= G_QUEUE_INIT; - +GQueue moduleOptions= G_QUEUE_INIT; + +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; +static ModuleOption optionSyncAnalysis= { + .longName= "sync-analysis", + .hasArg= REQUIRED_ARG, + .optionHelp= "specify the algorithm to use for event analysis", +}; +static ModuleOption optionSyncGraphs= { + .longName= "sync-graphs", + .hasArg= NO_ARG, + {.present= false}, + .optionHelp= "output gnuplot graph showing synchronization points", +}; +static ModuleOption optionSyncGraphsDir= { + .longName= "sync-graphs-dir", + .hasArg= REQUIRED_ARG, + .optionHelp= "specify the directory where to store the graphs", +}; /* * Module init function @@ -77,51 +104,37 @@ GQueue analysisModules= G_QUEUE_INIT; */ static void init() { - GString* analysisModulesNames; int retval; g_debug("\t\t\tXXXX sync init\n"); - optionSync= FALSE; - lttv_option_add("sync", '\0', "synchronize the time between the traces" , - "none", LTTV_OPT_NONE, &optionSync, NULL, NULL); - - optionSyncStats= FALSE; - lttv_option_add("sync-stats", '\0', "print statistics about the time " - "synchronization", "none", LTTV_OPT_NONE, &optionSyncStats, NULL, - NULL); - - optionSyncNull= FALSE; - lttv_option_add("sync-null", '\0', "read the events but do not perform " - "any processing", "none", LTTV_OPT_NONE, &optionSyncNull, NULL, NULL); - g_assert(g_queue_get_length(&analysisModules) > 0); - optionSyncAnalysis= ((AnalysisModule*) + optionSyncAnalysis.arg = ((AnalysisModule*) g_queue_peek_head(&analysisModules))->name; analysisModulesNames= g_string_new(""); g_queue_foreach(&analysisModules, &gfAppendAnalysisName, analysisModulesNames); // remove the last ", " g_string_truncate(analysisModulesNames, analysisModulesNames->len - 2); - lttv_option_add("sync-analysis", '\0', "specify the algorithm to use for " - "event analysis" , analysisModulesNames->str, LTTV_OPT_STRING, - &optionSyncAnalysis, NULL, NULL); - g_string_free(analysisModulesNames, TRUE); - - optionSyncGraphs= FALSE; - lttv_option_add("sync-graphs", '\0', "output gnuplot graph showing " - "synchronization points", "none", LTTV_OPT_NONE, &optionSyncGraphs, - NULL, NULL); + optionSyncAnalysis.argHelp= analysisModulesNames->str; retval= snprintf(graphsDir, sizeof(graphsDir), "graphs-%d", getpid()); if (retval > sizeof(graphsDir) - 1) { graphsDir[sizeof(graphsDir) - 1]= '\0'; } - optionSyncGraphsDir= graphsDir; - lttv_option_add("sync-graphs-dir", '\0', "specify the directory where to" - " store the graphs", graphsDir, LTTV_OPT_STRING, &optionSyncGraphsDir, - NULL, NULL); + optionSyncGraphsDir.arg= graphsDir; + optionSyncGraphsDir.argHelp= graphsDir; + + g_queue_push_head(&moduleOptions, &optionSyncGraphsDir); + g_queue_push_head(&moduleOptions, &optionSyncGraphs); + g_queue_push_head(&moduleOptions, &optionSyncAnalysis); + g_queue_push_head(&moduleOptions, &optionSyncNull); + g_queue_push_head(&moduleOptions, &optionSyncStats); + g_queue_push_head(&moduleOptions, &optionSync); + + g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL); + } @@ -132,12 +145,13 @@ static void destroy() { g_debug("\t\t\tXXXX sync destroy\n"); - lttv_option_remove("sync"); - lttv_option_remove("sync-stats"); - lttv_option_remove("sync-null"); - lttv_option_remove("sync-analysis"); - lttv_option_remove("sync-graphs"); - lttv_option_remove("sync-graphs-dir"); + g_queue_foreach(&moduleOptions, &gfRemoveModuleOption, NULL); + g_string_free(analysisModulesNames, TRUE); + + g_queue_clear(&processingModules); + g_queue_clear(&matchingModules); + g_queue_clear(&analysisModules); + g_queue_clear(&moduleOptions); } @@ -155,18 +169,16 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) struct timeval startTime, endTime; struct rusage startUsage, endUsage; GList* result; - char* cwd; FILE* graphsStream; - int graphsFp; int retval; - if (optionSync == FALSE) + if (!optionSync.present) { g_debug("Not synchronizing traceset because option is disabled"); return; } - if (optionSyncStats) + if (optionSyncStats.present) { gettimeofday(&startTime, 0); getrusage(RUSAGE_SELF, &startUsage); @@ -176,7 +188,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) syncState= malloc(sizeof(SyncState)); syncState->traceNb= lttv_traceset_number(traceSetContext->ts); - if (optionSyncStats) + if (optionSyncStats.present) { syncState->stats= true; } @@ -185,9 +197,9 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) syncState->stats= false; } - if (optionSyncGraphs) + if (optionSyncGraphs.present) { - syncState->graphs= optionSyncGraphsDir; + syncState->graphs= optionSyncGraphsDir.arg; } else { @@ -196,7 +208,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) // Identify and initialize processing module syncState->processingData= NULL; - if (optionSyncNull) + if (optionSyncNull.present) { result= g_queue_find_custom(&processingModules, "LTTV-null", &gcfCompareProcessing); @@ -213,6 +225,9 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) if (syncState->graphs && syncState->processingModule->writeProcessingGraphsPlots != NULL) { + char* cwd; + int graphsFp; + // Create the graph directory right away in case the module initialization // functions have something to write in it. cwd= changeToGraphDir(syncState->graphs); @@ -237,11 +252,11 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) } // Identify matching and analysis modules - g_assert(g_queue_get_length(&matchingModules) == 1); - syncState->matchingModule= (MatchingModule*) - g_queue_peek_head(&matchingModules); + result= g_queue_find_custom(&matchingModules, "TCP", &gcfCompareMatching); + g_assert(result != NULL); + syncState->matchingModule= (MatchingModule*) result->data; - result= g_queue_find_custom(&analysisModules, optionSyncAnalysis, + result= g_queue_find_custom(&analysisModules, optionSyncAnalysis.arg, &gcfCompareAnalysis); if (result != NULL) { @@ -249,7 +264,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) } else { - g_error("Analysis module '%s' not found", optionSyncAnalysis); + g_error("Analysis module '%s' not found", optionSyncAnalysis.arg); } syncState->processingModule->initProcessing(syncState, traceSetContext); @@ -257,7 +272,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) syncState->matchingData= NULL; syncState->analysisData= NULL; - if (!optionSyncNull) + if (!optionSyncNull.present) { syncState->matchingModule->initMatching(syncState); syncState->analysisModule->initAnalysis(syncState); @@ -346,7 +361,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) free(syncState); - if (optionSyncStats) + if (optionSyncStats.present) { gettimeofday(&endTime, 0); retval= getrusage(RUSAGE_SELF, &endUsage); @@ -372,7 +387,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) * end: end time, result is also stored in this structure * start: start time */ -static void timeDiff(struct timeval* const end, const struct timeval* const start) +void timeDiff(struct timeval* const end, const struct timeval* const start) { if (end->tv_usec >= start->tv_usec) { @@ -391,21 +406,44 @@ static void timeDiff(struct timeval* const end, const struct timeval* const star * A GCompareFunc for g_slist_find_custom() * * Args: - * a: AnalysisModule*, element's data + * a: ProcessingModule*, element's data * b: char*, user data to compare against * * Returns: - * 0 if the analysis module a's name is b + * 0 if the processing module a's name is b */ -static gint gcfCompareAnalysis(gconstpointer a, gconstpointer b) +gint gcfCompareProcessing(gconstpointer a, gconstpointer b) { - const AnalysisModule* analysisModule; + const ProcessingModule* processingModule; const char* name; - analysisModule= (const AnalysisModule*)a; - name= (const char*)b; + processingModule= (const ProcessingModule*) a; + name= (const char*) b; - return strncmp(analysisModule->name, name, strlen(analysisModule->name) + + return strncmp(processingModule->name, name, + strlen(processingModule->name) + 1); +} + + +/* + * A GCompareFunc for g_slist_find_custom() + * + * Args: + * a: MatchingModule*, element's data + * b: char*, user data to compare against + * + * Returns: + * 0 if the matching module a's name is b + */ +gint gcfCompareMatching(gconstpointer a, gconstpointer b) +{ + const MatchingModule* matchingModule; + const char* name; + + matchingModule= (const MatchingModule*) a; + name= (const char*) b; + + return strncmp(matchingModule->name, name, strlen(matchingModule->name) + 1); } @@ -414,22 +452,22 @@ static gint gcfCompareAnalysis(gconstpointer a, gconstpointer b) * A GCompareFunc for g_slist_find_custom() * * Args: - * a: ProcessingModule*, element's data + * a: AnalysisModule*, element's data * b: char*, user data to compare against * * Returns: * 0 if the analysis module a's name is b */ -static gint gcfCompareProcessing(gconstpointer a, gconstpointer b) +gint gcfCompareAnalysis(gconstpointer a, gconstpointer b) { - const ProcessingModule* processingModule; + const AnalysisModule* analysisModule; const char* name; - processingModule= (const ProcessingModule*)a; - name= (const char*)b; + analysisModule= (const AnalysisModule*) a; + name= (const char*) b; - return strncmp(processingModule->name, name, - strlen(processingModule->name) + 1); + return strncmp(analysisModule->name, name, strlen(analysisModule->name) + + 1); } @@ -459,7 +497,7 @@ static void gfAppendAnalysisName(gpointer data, gpointer user_data) * The current working directory before the execution of the function. The * string must be free'd by the caller. */ -char* changeToGraphDir(char* const graphs) +char* changeToGraphDir(const char* const graphs) { int retval; char* cwd; @@ -490,6 +528,43 @@ char* changeToGraphDir(char* const graphs) } +/* + * A GFunc for g_queue_foreach() + * + * Args: + * data: ModuleOption* + * user_data: NULL + */ +static void gfAddModuleOption(gpointer data, gpointer user_data) +{ + ModuleOption* option; + LttvOptionType conversion[]= { + [NO_ARG]= LTTV_OPT_NONE, + [REQUIRED_ARG]= LTTV_OPT_STRING, + }; + + 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); +} + + +/* + * A GFunc for g_queue_foreach() + * + * Args: + * data: ModuleOption* + * user_data: NULL + */ +static void gfRemoveModuleOption(gpointer data, gpointer user_data) +{ + lttv_option_remove(((ModuleOption*) data)->longName); +} + + LTTV_MODULE("sync", "Synchronize traces", \ "Synchronizes a traceset based on the correspondance of network events", \ init, destroy, "option")