X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fsync_chain_lttv.c;h=5dd10bf9fb827deaa5ea6ea1777a2cee4a955b82;hb=2f07659468ff3427bb3923cdc5a7ec61b6e8bbce;hp=9652f346328da0f6138f10bed0107ecbe1a82468;hpb=2bd4b3e43e525da7b4c9738915ec847f7fe4906a;p=lttv.git diff --git a/lttv/lttv/sync/sync_chain_lttv.c b/lttv/lttv/sync/sync_chain_lttv.c index 9652f346..5dd10bf9 100644 --- a/lttv/lttv/sync/sync_chain_lttv.c +++ b/lttv/lttv/sync/sync_chain_lttv.c @@ -34,11 +34,7 @@ #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(); @@ -48,11 +44,6 @@ 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", @@ -106,7 +97,7 @@ 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*) @@ -143,7 +134,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 +160,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) struct timeval startTime, endTime; struct rusage startUsage, endUsage; GList* result; - FILE* graphsStream; + unsigned int i; int retval; if (!optionSync.present) @@ -199,14 +190,18 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) if (optionSyncGraphs.present) { - syncState->graphs= optionSyncGraphsDir.arg; + // Create the graph directory right away in case the module initialization + // functions have something to write in it. + syncState->graphsDir= optionSyncGraphsDir.arg; + syncState->graphsStream= createGraphsDir(syncState->graphsDir); } else { - syncState->graphs= NULL; + syncState->graphsStream= NULL; + syncState->graphsDir= NULL; } - // Identify and initialize processing module + // Identify and initialize modules syncState->processingData= NULL; if (optionSyncNull.present) { @@ -221,41 +216,12 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) g_assert(result != NULL); syncState->processingModule= (ProcessingModule*) result->data; - graphsStream= NULL; - 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); - - 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 ((graphsStream= fdopen(graphsFp, "w")) == NULL) - { - g_error(strerror(errno)); - } - - retval= chdir(cwd); - if (retval == -1) - { - g_error(strerror(errno)); - } - free(cwd); - } - - // Identify matching and analysis modules + syncState->matchingData= NULL; result= g_queue_find_custom(&matchingModules, "TCP", &gcfCompareMatching); g_assert(result != NULL); syncState->matchingModule= (MatchingModule*) result->data; + syncState->analysisData= NULL; result= g_queue_find_custom(&analysisModules, optionSyncAnalysis.arg, &gcfCompareAnalysis); if (result != NULL) @@ -267,16 +233,12 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) g_error("Analysis module '%s' not found", optionSyncAnalysis.arg); } - syncState->processingModule->initProcessing(syncState, traceSetContext); - - syncState->matchingData= NULL; - syncState->analysisData= NULL; - if (!optionSyncNull.present) { - syncState->matchingModule->initMatching(syncState); syncState->analysisModule->initAnalysis(syncState); + syncState->matchingModule->initMatching(syncState); } + syncState->processingModule->initProcessing(syncState, traceSetContext); // Process traceset lttv_process_traceset_seek_time(traceSetContext, ltt_time_zero); @@ -287,58 +249,11 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) syncState->processingModule->finalizeProcessing(syncState); // Write graphs file - if (graphsStream != NULL) + if (optionSyncGraphs.present) { - unsigned int i, j; + writeGraphsScript(syncState); - fprintf(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 pos; - - fprintf(graphsStream, - "\nset output \"%03d-%03d.eps\"\n" - "plot \\\n", i, j); - - syncState->processingModule->writeProcessingGraphsPlots(graphsStream, - syncState, i, j); - - // Remove the ", \\\n" from the last graph plot line - fflush(graphsStream); - pos= ftell(graphsStream); - if (ftruncate(fileno(graphsStream), pos - 4) == -1) - { - g_error(strerror(errno)); - } - if (fseek(graphsStream, 0, SEEK_END) == -1) - { - g_error(strerror(errno)); - } - - fprintf(graphsStream, - "\nset output \"%1$03d-%2$03d.eps\"\n" - "set key inside right bottom\n" - "set title \"\"\n" - "set xlabel \"Clock %1$u\"\n" - "set xtics nomirror\n" - "set ylabel \"Clock %2$u\"\n" - "set ytics nomirror\n", i, j); - - syncState->processingModule->writeProcessingGraphsOptions(graphsStream, - syncState, i, j); - - fprintf(graphsStream, - "replot\n"); - } - } - - if (fclose(graphsStream) != 0) + if (fclose(syncState->graphsStream) != 0) { g_error(strerror(errno)); } @@ -348,6 +263,31 @@ void syncTraceset(LttvTracesetContext* const traceSetContext) { syncState->processingModule->printProcessingStats(syncState); } + if (syncState->matchingModule->printMatchingStats != NULL) + { + syncState->matchingModule->printMatchingStats(syncState); + } + if (syncState->analysisModule->printAnalysisStats != NULL) + { + syncState->analysisModule->printAnalysisStats(syncState); + } + + if (optionSyncStats.present) + { + printf("Resulting synchronization factors:\n"); + for (i= 0; i < syncState->traceNb; i++) + { + LttTrace* t; + + t= traceSetContext->traces[i]->t; + + printf("\ttrace %u drift= %g offset= %g (%f) start time= %ld.%09ld\n", + i, t->drift, t->offset, (double) tsc_to_uint64(t->freq_scale, + t->start_freq, t->offset) / NANOSECONDS_PER_SECOND, + t->start_time_from_tsc.tv_sec, + t->start_time_from_tsc.tv_nsec); + } + } syncState->processingModule->destroyProcessing(syncState); if (syncState->matchingModule != NULL) @@ -380,97 +320,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() * @@ -487,47 +336,6 @@ static void gfAppendAnalysisName(gpointer data, gpointer 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() *