X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Fmodules%2Ftext%2Fsync_chain_batch.c;h=8ac77fd9fb2188ddcc6c592d5a7b6fa46cbd04e3;hb=e072e1abc02d780d84664fcb2c971eb5a317f664;hp=3a4bc0dff42909940be1644131f5e98231609463;hpb=f10c27a850e57bf88bf1d4440eb450729782f409;p=lttv.git diff --git a/lttv/modules/text/sync_chain_batch.c b/lttv/modules/text/sync_chain_batch.c index 3a4bc0df..8ac77fd9 100644 --- a/lttv/modules/text/sync_chain_batch.c +++ b/lttv/modules/text/sync_chain_batch.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include #include @@ -54,7 +54,6 @@ struct TracesetChainState { SyncState* syncState; struct timeval startTime; struct rusage startUsage; - FILE* graphsStream; }; static LttvHooks* before_traceset, * before_trace, * event_hook, * after_traceset; @@ -124,7 +123,7 @@ static void init() "synchronization points", "none", LTTV_OPT_NONE, &optionEvalGraphs, NULL, NULL); - retval= snprintf(graphsDir, sizeof(graphsDir), "graphs-%d", getpid()); + retval= snprintf(graphsDir, sizeof(graphsDir), "eval-graphs-%d", getpid()); if (retval > sizeof(graphsDir) - 1) { graphsDir[sizeof(graphsDir) - 1]= '\0'; @@ -295,29 +294,14 @@ void setupSyncChain(LttvTracesetContext* const traceSetContext) syncState->stats= true; if (optionEvalGraphs) - { - syncState->graphs= optionEvalGraphsDir; - } - else - { - syncState->graphs= NULL; - } - - syncState->processingData= NULL; - result= g_queue_find_custom(&processingModules, "LTTV-standard", - &gcfCompareProcessing); - syncState->processingModule= (ProcessingModule*) result->data; - - tracesetChainState->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); + syncState->graphsDir= optionEvalGraphsDir; + cwd= changeToGraphDir(optionEvalGraphsDir); 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 @@ -325,11 +309,15 @@ void setupSyncChain(LttvTracesetContext* const traceSetContext) { g_error(strerror(errno)); } - if ((tracesetChainState->graphsStream= fdopen(graphsFp, "w")) == NULL) + if ((syncState->graphsStream= fdopen(graphsFp, "w")) == NULL) { g_error(strerror(errno)); } + fprintf(syncState->graphsStream, + "#!/usr/bin/gnuplot\n\n" + "set terminal postscript eps color size 8in,6in\n"); + retval= chdir(cwd); if (retval == -1) { @@ -337,18 +325,29 @@ void setupSyncChain(LttvTracesetContext* const traceSetContext) } free(cwd); } - - syncState->matchingData= NULL; - result= g_queue_find_custom(&matchingModules, "broadcast", &gcfCompareMatching); - syncState->matchingModule= (MatchingModule*) result->data; + else + { + syncState->graphsStream= NULL; + syncState->graphsDir= NULL; + } syncState->analysisData= NULL; - result= g_queue_find_custom(&analysisModules, "chull", &gcfCompareAnalysis); + result= g_queue_find_custom(&analysisModules, "eval", + &gcfCompareAnalysis); syncState->analysisModule= (AnalysisModule*) result->data; + syncState->analysisModule->initAnalysis(syncState); - syncState->processingModule->initProcessing(syncState, traceSetContext); + syncState->matchingData= NULL; + result= g_queue_find_custom(&matchingModules, "distributor", + &gcfCompareMatching); + syncState->matchingModule= (MatchingModule*) result->data; syncState->matchingModule->initMatching(syncState); - syncState->analysisModule->initAnalysis(syncState); + + syncState->processingData= NULL; + result= g_queue_find_custom(&processingModules, "LTTV-standard", + &gcfCompareProcessing); + syncState->processingModule= (ProcessingModule*) result->data; + syncState->processingModule->initProcessing(syncState, traceSetContext); } @@ -364,6 +363,7 @@ void teardownSyncChain(LttvTracesetContext* const traceSetContext) SyncState* syncState; struct timeval endTime; struct rusage endUsage; + unsigned int i, j; int retval; tracesetChainState= g_hash_table_lookup(tracesetChainStates, traceSetContext); @@ -372,58 +372,88 @@ void teardownSyncChain(LttvTracesetContext* const traceSetContext) syncState->processingModule->finalizeProcessing(syncState); // Write graphs file - if (tracesetChainState->graphsStream != NULL) + if (optionEvalGraphs) { - unsigned int i, j; - - fprintf(tracesetChainState->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; + long pos1, pos2, trunc; - fprintf(tracesetChainState->graphsStream, - "\nset output \"%03d-%03d.eps\"\n" + fprintf(syncState->graphsStream, + "\nreset\n" + "set output \"%03d-%03d.eps\"\n" "plot \\\n", i, j); + pos1= ftell(syncState->graphsStream); + + 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); + } - syncState->processingModule->writeProcessingGraphsPlots(tracesetChainState->graphsStream, - 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; + } - // Remove the ", \\\n" from the last graph plot line - fflush(tracesetChainState->graphsStream); - pos= ftell(tracesetChainState->graphsStream); - if (ftruncate(fileno(tracesetChainState->graphsStream), pos - 4) == -1) + if (ftruncate(fileno(syncState->graphsStream), trunc) == -1) { g_error(strerror(errno)); } - if (fseek(tracesetChainState->graphsStream, 0, SEEK_END) == -1) + if (fseek(syncState->graphsStream, 0, SEEK_END) == -1) { g_error(strerror(errno)); } - fprintf(tracesetChainState->graphsStream, + fprintf(syncState->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(tracesetChainState->graphsStream, - syncState, i, j); - - fprintf(tracesetChainState->graphsStream, - "replot\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"); + } } } - if (fclose(tracesetChainState->graphsStream) != 0) + if (fclose(syncState->graphsStream) != 0) { g_error(strerror(errno)); } @@ -433,6 +463,27 @@ void teardownSyncChain(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); + } + + 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)