X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Fmodules%2Ftext%2Fsync_chain_batch.c;h=10ee5f093af37babe16d9bef2c1c4949507a6f27;hb=b9ce0bad7daf7c0a2333c91fdb1e35d602afe17f;hp=b3f873ca76eceeb4719f9022c39e472265c02b8c;hpb=d6ee500355b870e83d5cdbc431629999ec97794e;p=lttv.git diff --git a/lttv/modules/text/sync_chain_batch.c b/lttv/modules/text/sync_chain_batch.c index b3f873ca..10ee5f09 100644 --- a/lttv/modules/text/sync_chain_batch.c +++ b/lttv/modules/text/sync_chain_batch.c @@ -12,8 +12,8 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H @@ -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; @@ -285,52 +284,30 @@ void setupSyncChain(LttvTracesetContext* const traceSetContext) struct TracesetChainState* tracesetChainState; SyncState* syncState; GList* result; - int retval; tracesetChainState= g_hash_table_lookup(tracesetChainStates, traceSetContext); syncState= malloc(sizeof(SyncState)); tracesetChainState->syncState= syncState; syncState->traceNb= lttv_traceset_number(traceSetContext->ts); + // Statistics are always on with eval syncState->stats= true; if (optionEvalGraphs) { - syncState->graphs= optionEvalGraphsDir; + // Create the graph directory right away in case the module initialization + // functions have something to write in it. + syncState->graphsDir= optionEvalGraphsDir; + syncState->graphsStream= createGraphsDir(syncState->graphsDir); } else { - syncState->graphs= NULL; + syncState->graphsStream= NULL; + syncState->graphsDir= NULL; } - tracesetChainState->graphsStream= NULL; - if (syncState->graphs) - { - 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 ((tracesetChainState->graphsStream= fdopen(graphsFp, "w")) == NULL) - { - g_error(strerror(errno)); - } - - retval= chdir(cwd); - if (retval == -1) - { - g_error(strerror(errno)); - } - free(cwd); - } + syncState->reductionData= NULL; + syncState->reductionModule= NULL; syncState->analysisData= NULL; result= g_queue_find_custom(&analysisModules, "eval", @@ -364,110 +341,25 @@ 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); syncState= tracesetChainState->syncState; - syncState->processingModule->finalizeProcessing(syncState); + freeAllFactors(syncState->processingModule->finalizeProcessing(syncState), + syncState->traceNb); // Write graphs file - if (tracesetChainState->graphsStream != NULL) + if (optionEvalGraphs) { - 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 pos1, pos2, trunc; - - fprintf(tracesetChainState->graphsStream, - "\nset output \"%03d-%03d.eps\"\n" - "plot \\\n", i, j); - pos1= ftell(tracesetChainState->graphsStream); - - if (syncState->analysisModule->writeAnalysisGraphsPlots) - { - syncState->analysisModule->writeAnalysisGraphsPlots(tracesetChainState->graphsStream, - syncState, i, j); - } - - fflush(tracesetChainState->graphsStream); - pos2= ftell(tracesetChainState->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(tracesetChainState->graphsStream), trunc) == -1) - { - g_error(strerror(errno)); - } - if (fseek(tracesetChainState->graphsStream, 0, SEEK_END) == -1) - { - g_error(strerror(errno)); - } - - fprintf(tracesetChainState->graphsStream, - "\nset output \"%1$03d-%2$03d.eps\"\n" - "set title \"\"\n", i, j); - - if (syncState->analysisModule->writeAnalysisGraphsOptions) - { - syncState->analysisModule->writeAnalysisGraphsOptions(tracesetChainState->graphsStream, - syncState, i, j); - } - - if (pos1 != pos2) - { - fprintf(tracesetChainState->graphsStream, "replot\n"); - } - } - } + writeGraphsScript(syncState); - if (fclose(tracesetChainState->graphsStream) != 0) + if (fclose(syncState->graphsStream) != 0) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } } - if (syncState->processingModule->printProcessingStats != NULL) - { - 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); - } + printStats(syncState); syncState->processingModule->destroyProcessing(syncState); if (syncState->matchingModule != NULL) @@ -478,11 +370,15 @@ void teardownSyncChain(LttvTracesetContext* const traceSetContext) { syncState->analysisModule->destroyAnalysis(syncState); } + if (syncState->reductionModule != NULL) + { + syncState->reductionModule->destroyReduction(syncState); + } free(syncState); gettimeofday(&endTime, 0); - retval= getrusage(RUSAGE_SELF, &endUsage); + getrusage(RUSAGE_SELF, &endUsage); timeDiff(&endTime, &tracesetChainState->startTime); timeDiff(&endUsage.ru_utime, &tracesetChainState->startUsage.ru_utime);