X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fevent_analysis_eval.c;h=8dbf5bb60ec3439fa26b53e37c7502a609a1f23a;hb=1111bb0f69e3c01c9264b19cbc7d2a8a02eeb569;hp=d5c3be290c2fc1016e689ce12e004bdec6a569b2;hpb=ab6edc6a1a55aefe52cfd9e610b5f21ee2029544;p=lttv.git diff --git a/lttv/lttv/sync/event_analysis_eval.c b/lttv/lttv/sync/event_analysis_eval.c index d5c3be29..8dbf5bb6 100644 --- a/lttv/lttv/sync/event_analysis_eval.c +++ b/lttv/lttv/sync/event_analysis_eval.c @@ -57,6 +57,10 @@ static void analyzeBroadcastEval(SyncState* const syncState, Broadcast* const broadcast); static AllFactors* finalizeAnalysisEval(SyncState* const syncState); static void printAnalysisStatsEval(SyncState* const syncState); +static void writeAnalysisTraceTimeBackPlotsEval(SyncState* const syncState, + const unsigned int i, const unsigned int j); +static void writeAnalysisTraceTimeForePlotsEval(SyncState* const syncState, + const unsigned int i, const unsigned int j); // Functions specific to this module static guint ghfRttKeyHash(gconstpointer key); @@ -104,7 +108,10 @@ static AnalysisModule analysisModuleEval= { .analyzeBroadcast= &analyzeBroadcastEval, .finalizeAnalysis= &finalizeAnalysisEval, .printAnalysisStats= &printAnalysisStatsEval, - .graphFunctions= {} + .graphFunctions= { + .writeTraceTimeBackPlots= &writeAnalysisTraceTimeBackPlotsEval, + .writeTraceTimeForePlots= &writeAnalysisTraceTimeForePlotsEval, + } }; static ModuleOption optionEvalRttFile= { @@ -154,7 +161,7 @@ static void initAnalysisEval(SyncState* const syncState) rttStream= fopen(optionEvalRttFile.arg, "r"); if (rttStream == NULL) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } readRttInfo(analysisData->rttInfo, rttStream); @@ -162,7 +169,7 @@ static void initAnalysisEval(SyncState* const syncState) retval= fclose(rttStream); if (retval == EOF) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } } @@ -188,6 +195,7 @@ static void initAnalysisEval(SyncState* const syncState) if (syncState->graphsStream) { AnalysisGraphsEval* graphs= malloc(sizeof(AnalysisGraphsEval)); + GList* result; analysisData->graphs= graphs; @@ -205,6 +213,14 @@ static void initAnalysisEval(SyncState* const syncState) graphs->bounds[i][j].max= 0; } } + + graphs->chullSS= (SyncState*) malloc(sizeof(SyncState)); + memcpy(graphs->chullSS, syncState, sizeof(SyncState)); + graphs->chullSS->analysisData= NULL; + result= g_queue_find_custom(&analysisModules, "chull", &gcfCompareAnalysis); + g_assert(result != NULL); + graphs->chullSS->analysisModule= (AnalysisModule*) result->data; + graphs->chullSS->analysisModule->initAnalysis(graphs->chullSS); } } @@ -258,14 +274,14 @@ static AnalysisHistogramEval* constructAnalysisHistogramEval(const char* const if ((*(FILE**)((void*) histogram + loopValues[i].pointsOffset)= fopen(name, "w")) == NULL) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } } retval= chdir(cwd); if (retval == -1) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } free(cwd); @@ -298,7 +314,7 @@ static void destroyAnalysisHistogramEval(AnalysisHistogramEval* const retval= fclose(*(FILE**)((void*) histogram + loopValues[i].pointsOffset)); if (retval != 0) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } } @@ -447,11 +463,11 @@ static void writeHistogram(FILE* graphsStream, const struct RttKey* rttKey, // Remove the ",\\\n" from the last graph plot line if (ftruncate(fileno(graphsStream), ftell(graphsStream) - 3) == -1) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } if (fseek(graphsStream, 0, SEEK_END) == -1) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } fprintf(graphsStream, "\n"); } @@ -510,6 +526,9 @@ static void destroyAnalysisEval(SyncState* const syncState) } free(graphs->bounds); + graphs->chullSS->analysisModule->destroyAnalysis(graphs->chullSS); + free(graphs->chullSS); + free(graphs); } @@ -531,7 +550,7 @@ static void analyzeMessageEval(SyncState* const syncState, Message* const message) { AnalysisDataEval* analysisData= syncState->analysisData; - MessageStats* messageStats; + MessageStats* messageStats = NULL; /* for gcc */ double* rtt; double tt; struct RttKey rttKey; @@ -612,6 +631,9 @@ static void analyzeMessageEval(SyncState* const syncState, Message* const { updateBounds(analysisData->graphs->bounds, message->inE, message->outE); + + analysisData->graphs->chullSS->analysisModule->analyzeMessage(analysisData->graphs->chullSS, + message); } } @@ -806,6 +828,9 @@ static AllFactors* finalizeAnalysisEval(SyncState* const syncState) { AnalysisDataEval* analysisData= syncState->analysisData; + /* This function may be run twice because of matching_distributor. This + * check is there to make sure the next block is run only once. + */ if (syncState->graphsStream && analysisData->graphs->histograms) { g_hash_table_foreach(analysisData->graphs->histograms, @@ -813,6 +838,14 @@ static AllFactors* finalizeAnalysisEval(SyncState* const syncState) analysisData->rttInfo, .graphsStream= syncState->graphsStream}); g_hash_table_destroy(analysisData->graphs->histograms); analysisData->graphs->histograms= NULL; + + if (syncState->graphsStream) + { + SyncState* chullSS= analysisData->graphs->chullSS; + + freeAllFactors(chullSS->analysisModule->finalizeAnalysis(chullSS), + chullSS->traceNb); + } } return createAllFactors(syncState->traceNb); @@ -1078,7 +1111,7 @@ static void readRttInfo(GHashTable* rttInfo, FILE* rttStream) if (retval == -1 && !feof(rttStream)) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } if (line[retval - 1] == '\n') @@ -1091,7 +1124,7 @@ static void readRttInfo(GHashTable* rttInfo, FILE* rttStream) &tmp); if (retval == EOF) { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } else if (retval != 3) { @@ -1154,7 +1187,7 @@ static void positionStream(FILE* stream) } else { - g_error(strerror(errno)); + g_error("%s", strerror(errno)); } } } @@ -1392,3 +1425,49 @@ static void updateBounds(Bounds** const bounds, Event* const e1, Event* const tpBounds->max= messageTime; } } + + +/* + * Write the analysis-specific graph lines in the gnuplot script. + * + * Args: + * syncState: container for synchronization data + * i: first trace number + * j: second trace number, garanteed to be larger than i + */ +static void writeAnalysisTraceTimeBackPlotsEval(SyncState* const syncState, + const unsigned int i, const unsigned int j) +{ + SyncState* chullSS= ((AnalysisDataEval*) + syncState->analysisData)->graphs->chullSS; + const GraphFunctions* graphFunctions= + &chullSS->analysisModule->graphFunctions; + + if (graphFunctions->writeTraceTimeBackPlots != NULL) + { + graphFunctions->writeTraceTimeBackPlots(chullSS, i, j); + } +} + + +/* + * Write the analysis-specific graph lines in the gnuplot script. + * + * Args: + * syncState: container for synchronization data + * i: first trace number + * j: second trace number, garanteed to be larger than i + */ +static void writeAnalysisTraceTimeForePlotsEval(SyncState* const syncState, + const unsigned int i, const unsigned int j) +{ + SyncState* chullSS= ((AnalysisDataEval*) + syncState->analysisData)->graphs->chullSS; + const GraphFunctions* graphFunctions= + &chullSS->analysisModule->graphFunctions; + + if (graphFunctions->writeTraceTimeForePlots != NULL) + { + graphFunctions->writeTraceTimeForePlots(chullSS, i, j); + } +}