X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fevent_analysis_linreg.c;h=2ceecf3e13eed80a850664e92b06f92ed0d49827;hb=fafb0a2998296c564cbc26c2c0fa5142b181b332;hp=8a7bd22777b977708e8065797e9f480fcd62c7c9;hpb=70407e861d8430dbe06cc52e6fe4ed5c9cd0872a;p=lttv.git diff --git a/lttv/lttv/sync/event_analysis_linreg.c b/lttv/lttv/sync/event_analysis_linreg.c index 8a7bd227..2ceecf3e 100644 --- a/lttv/lttv/sync/event_analysis_linreg.c +++ b/lttv/lttv/sync/event_analysis_linreg.c @@ -32,21 +32,18 @@ #include "event_analysis_linreg.h" -#ifndef g_info -#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) -#endif - - // Functions common to all analysis modules static void initAnalysisLinReg(SyncState* const syncState); static void destroyAnalysisLinReg(SyncState* const syncState); -static void analyzeExchangeLinReg(SyncState* const syncState, Packet* const packet); +static void analyzeExchangeLinReg(SyncState* const syncState, Exchange* const exchange); static GArray* finalizeAnalysisLinReg(SyncState* const syncState); static void printAnalysisStatsLinReg(SyncState* const syncState); +static void writeAnalysisGraphsPlotsLinReg(SyncState* const syncState, const + unsigned int i, const unsigned int j); // Functions specific to this module -static void registerAnalysisLinReg() __attribute__((constructor (101))); +static void registerAnalysisLinReg() __attribute__((constructor (102))); static void finalizeLSA(SyncState* const syncState); static void doGraphProcessing(SyncState* const syncState); @@ -69,10 +66,12 @@ static AnalysisModule analysisModuleLinReg= { .name= "linreg", .initAnalysis= &initAnalysisLinReg, .destroyAnalysis= &destroyAnalysisLinReg, - .analyzePacket= NULL, .analyzeExchange= &analyzeExchangeLinReg, .finalizeAnalysis= &finalizeAnalysisLinReg, .printAnalysisStats= &printAnalysisStatsLinReg, + .graphFunctions= { + .writeTraceTraceForePlots= &writeAnalysisGraphsPlotsLinReg, + } }; @@ -166,47 +165,38 @@ static void destroyAnalysisLinReg(SyncState* const syncState) /* * Perform analysis on a series of event pairs. * - * If one event pair is a packet, an exchange is composed of at least two - * packets, one in each direction. There should be a non-negative minimum - * "round trip time" (RTT) between the first and last event of the exchange. - * This RTT should be as small as possible so these packets should be closely - * related in time like a data packet and an acknowledgement packet. If the - * events analyzed are such that the minimum RTT can be zero, there's nothing - * gained in analyzing exchanges beyond what can already be figured out by - * analyzing packets. - * - * An exchange can also consist of more than two packets, in case one packet - * single handedly acknowledges many data packets. - * * Args: * syncState container for synchronization data - * packet structure containing the many events + * exchange structure containing the many events */ -static void analyzeExchangeLinReg(SyncState* const syncState, Packet* const packet) +static void analyzeExchangeLinReg(SyncState* const syncState, Exchange* const exchange) { unsigned int ni, nj; double dji, eji; double timoy; Fit* fit; - Packet* ackedPacket; + Message* ackedMessage; AnalysisDataLinReg* analysisData; g_debug("Synchronization calculation, "); g_debug("%d acked packets - using last one, ", - g_queue_get_length(packet->acks)); + g_queue_get_length(exchange->acks)); analysisData= (AnalysisDataLinReg*) syncState->analysisData; - ackedPacket= g_queue_peek_tail(packet->acks); + ackedMessage= g_queue_peek_tail(exchange->acks); // Calculate the intermediate values for the // least-squares analysis - dji= ((double) ackedPacket->inE->tsc - (double) ackedPacket->outE->tsc + - (double) packet->outE->tsc - (double) packet->inE->tsc) / 2; - eji= fabs((double) ackedPacket->inE->tsc - (double) ackedPacket->outE->tsc - - (double) packet->outE->tsc + (double) packet->inE->tsc) / 2; - timoy= ((double) ackedPacket->outE->tsc + (double) packet->inE->tsc) / 2; - ni= ackedPacket->outE->traceNum; - nj= ackedPacket->inE->traceNum; + dji= ((double) ackedMessage->inE->cpuTime - (double) ackedMessage->outE->cpuTime + + (double) exchange->message->outE->cpuTime - (double) + exchange->message->inE->cpuTime) / 2; + eji= fabs((double) ackedMessage->inE->cpuTime - (double) + ackedMessage->outE->cpuTime - (double) exchange->message->outE->cpuTime + + (double) exchange->message->inE->cpuTime) / 2; + timoy= ((double) ackedMessage->outE->cpuTime + (double) + exchange->message->inE->cpuTime) / 2; + ni= ackedMessage->outE->traceNum; + nj= ackedMessage->inE->traceNum; fit= &analysisData->fitArray[nj][ni]; fit->n++; @@ -483,6 +473,7 @@ static GArray* calculateFactors(SyncState* const syncState) analysisData= (AnalysisDataLinReg*) syncState->analysisData; factors= g_array_sized_new(FALSE, FALSE, sizeof(Factors), syncState->traceNb); + g_array_set_size(factors, syncState->traceNb); // Calculate the resulting offset and drift between each trace and its // reference @@ -743,3 +734,27 @@ static gint gcfGraphTraceCompare(gconstpointer a, gconstpointer b) } } + +/* + * Write the analysis-specific graph lines in the gnuplot script. + * + * Args: + * syncState: container for synchronization data + * i: first trace number, on the x axis + * j: second trace number, garanteed to be larger than i + */ +void writeAnalysisGraphsPlotsLinReg(SyncState* const syncState, const unsigned + int i, const unsigned int j) +{ + AnalysisDataLinReg* analysisData; + Fit* fit; + + analysisData= (AnalysisDataLinReg*) syncState->analysisData; + fit= &analysisData->fitArray[j][i]; + + fprintf(syncState->graphsStream, + "\t%7g + %7g * x " + "title \"Linreg conversion\" with lines " + "linecolor rgb \"gray60\" linetype 1, \\\n", + fit->d0, 1. + fit->x); +}