X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fsync_chain_lttv.c;h=bbd2b3aacb9b9d70b65f363722b15bfc40687406;hb=49c335f194a889e54de18abf4c11d135ed6b6a0e;hp=48a2be5884eb695d6e467e3106be63ff57621e59;hpb=8d7d16dd4f5f6ae09f556a9b0b477baaa93d468c;p=lttv.git diff --git a/lttv/lttv/sync/sync_chain_lttv.c b/lttv/lttv/sync/sync_chain_lttv.c index 48a2be58..bbd2b3aa 100644 --- a/lttv/lttv/sync/sync_chain_lttv.c +++ b/lttv/lttv/sync/sync_chain_lttv.c @@ -34,43 +34,28 @@ #include #include "sync_chain.h" - - -#ifndef g_info -#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) -#endif +#include "sync_chain_lttv.h" 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); -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; @@ -82,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 * @@ -106,10 +92,10 @@ static void init() { int retval; - g_debug("\t\t\tXXXX sync init\n"); + 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, @@ -134,7 +120,6 @@ static void init() g_queue_push_head(&moduleOptions, &optionSync); g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL); - } @@ -143,7 +128,7 @@ static void init() */ static void destroy() { - g_debug("\t\t\tXXXX sync destroy\n"); + g_debug("Sync destroy"); g_queue_foreach(&moduleOptions, &gfRemoveModuleOption, NULL); g_string_free(analysisModulesNames, TRUE); @@ -169,7 +154,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) struct timeval startTime, endTime; struct rusage startUsage, endUsage; GList* result; - unsigned int i, j; + unsigned int i; int retval; if (!optionSync.present) @@ -199,31 +184,10 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) if (optionSyncGraphs.present) { - char* cwd; - int graphsFp; - // Create the graph directory right away in case the module initialization // functions have something to write in it. syncState->graphsDir= optionSyncGraphsDir.arg; - cwd= changeToGraphDir(optionSyncGraphsDir.arg); - - if ((graphsFp= open("graphs.gnu", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | - S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH - | S_IWOTH | S_IXOTH)) == -1) - { - g_error(strerror(errno)); - } - if ((syncState->graphsStream= fdopen(graphsFp, "w")) == NULL) - { - g_error(strerror(errno)); - } - - retval= chdir(cwd); - if (retval == -1) - { - g_error(strerror(errno)); - } - free(cwd); + syncState->graphsStream= createGraphsDir(syncState->graphsDir); } else { @@ -281,86 +245,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) // Write graphs file if (optionSyncGraphs.present) { - fprintf(syncState->graphsStream, - "#!/usr/bin/gnuplot\n\n" - "set terminal postscript eps color size 8in,6in\n"); - - // Cover the upper triangular matrix, i is the reference node. - for (i= 0; i < syncState->traceNb; i++) - { - for (j= i + 1; j < syncState->traceNb; j++) - { - long pos1, pos2, trunc; - - fprintf(syncState->graphsStream, - "\nset output \"%03d-%03d.eps\"\n" - "plot \\\n", i, j); - - if (syncState->processingModule->writeProcessingGraphsPlots) - { - syncState->processingModule->writeProcessingGraphsPlots(syncState, - i, j); - } - if (syncState->matchingModule->writeMatchingGraphsPlots) - { - syncState->matchingModule->writeMatchingGraphsPlots(syncState, - i, j); - } - if (syncState->analysisModule->writeAnalysisGraphsPlots) - { - syncState->analysisModule->writeAnalysisGraphsPlots(syncState, - i, j); - } - - fflush(syncState->graphsStream); - pos2= ftell(syncState->graphsStream); - if (pos1 != pos2) - { - // Remove the ", \\\n" from the last graph plot line - trunc= pos2 - 4; - } - else - { - // Remove the "plot \\\n" line to avoid creating an invalid - // gnuplot script - trunc= pos2 - 7; - } - - if (ftruncate(fileno(syncState->graphsStream), trunc) == -1) - { - g_error(strerror(errno)); - } - if (fseek(syncState->graphsStream, 0, SEEK_END) == -1) - { - g_error(strerror(errno)); - } - - fprintf(syncState->graphsStream, - "\nset output \"%03d-%03d.eps\"\n" - "set title \"\"\n", i, j); - - if (syncState->processingModule->writeProcessingGraphsOptions) - { - syncState->processingModule->writeProcessingGraphsOptions(syncState, - i, j); - } - if (syncState->matchingModule->writeMatchingGraphsOptions) - { - syncState->matchingModule->writeMatchingGraphsOptions(syncState, - i, j); - } - if (syncState->analysisModule->writeAnalysisGraphsOptions) - { - syncState->analysisModule->writeAnalysisGraphsOptions(syncState, - i, j); - } - - if (pos1 != pos2) - { - fprintf(syncState->graphsStream, "replot\n"); - } - } - } + writeGraphsScript(syncState); if (fclose(syncState->graphsStream) != 0) { @@ -429,154 +314,6 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) } -/* - * Calculate the elapsed time between two timeval values - * - * Args: - * end: end time, result is also stored in this structure - * start: start time - */ -void timeDiff(struct timeval* const end, const struct timeval* const start) -{ - if (end->tv_usec >= start->tv_usec) - { - end->tv_sec-= start->tv_sec; - end->tv_usec-= start->tv_usec; - } - else - { - end->tv_sec= end->tv_sec - start->tv_sec - 1; - end->tv_usec= end->tv_usec - start->tv_usec + 1e6; - } -} - - -/* - * A GCompareFunc for g_slist_find_custom() - * - * Args: - * a: ProcessingModule*, element's data - * b: char*, user data to compare against - * - * Returns: - * 0 if the processing module a's name is b - */ -gint gcfCompareProcessing(gconstpointer a, gconstpointer b) -{ - const ProcessingModule* processingModule; - const char* name; - - processingModule= (const ProcessingModule*) a; - name= (const char*) b; - - 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); -} - - -/* - * A GCompareFunc for g_slist_find_custom() - * - * Args: - * a: AnalysisModule*, element's data - * b: char*, user data to compare against - * - * Returns: - * 0 if the analysis module a's name is b - */ -gint gcfCompareAnalysis(gconstpointer a, gconstpointer b) -{ - const AnalysisModule* analysisModule; - const char* name; - - analysisModule= (const AnalysisModule*) a; - name= (const char*) 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 - */ -static void gfAppendAnalysisName(gpointer data, gpointer user_data) -{ - g_string_append((GString*) user_data, ((AnalysisModule*) data)->name); - g_string_append((GString*) user_data, ", "); -} - - -/* - * Change to the directory used to hold graphs. Create it if necessary. - * - * Args: - * graph: name of directory - * - * Returns: - * The current working directory before the execution of the function. The - * string must be free'd by the caller. - */ -char* changeToGraphDir(const char* const graphs) -{ - int retval; - char* cwd; - - cwd= getcwd(NULL, 0); - if (cwd == NULL) - { - g_error(strerror(errno)); - } - while ((retval= chdir(graphs)) != 0) - { - if (errno == ENOENT) - { - retval= mkdir(graphs, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | - S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH); - if (retval != 0) - { - g_error(strerror(errno)); - } - } - else - { - g_error(strerror(errno)); - } - } - - return cwd; -} - - /* * A GFunc for g_queue_foreach() * @@ -586,18 +323,33 @@ char* changeToGraphDir(const char* const graphs) */ 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); + } }