#include <stdio.h>
#include <stdlib.h>
-#include "sync_chain.h"
+#include "sync_chain_lttv.h"
#include "event_analysis_linreg.h"
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(FILE* stream, 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);
.name= "linreg",
.initAnalysis= &initAnalysisLinReg,
.destroyAnalysis= &destroyAnalysisLinReg,
- .analyzePacket= NULL,
+ .analyzeMessage= NULL,
.analyzeExchange= &analyzeExchangeLinReg,
+ .analyzeBroadcast= NULL,
.finalizeAnalysis= &finalizeAnalysisLinReg,
.printAnalysisStats= &printAnalysisStatsLinReg,
+ .writeAnalysisGraphsPlots= &writeAnalysisGraphsPlotsLinReg,
+ .writeAnalysisGraphsOptions= NULL,
};
/*
* 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->time - (double) ackedMessage->outE->time
+ + (double) exchange->message->outE->time - (double)
+ exchange->message->inE->time) / 2;
+ eji= fabs((double) ackedMessage->inE->time - (double)
+ ackedMessage->outE->time - (double) exchange->message->outE->time +
+ (double) exchange->message->inE->time) / 2;
+ timoy= ((double) ackedMessage->outE->time + (double)
+ exchange->message->inE->time) / 2;
+ ni= ackedMessage->outE->traceNum;
+ nj= ackedMessage->inE->traceNum;
fit= &analysisData->fitArray[nj][ni];
fit->n++;
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
}
}
+
+/*
+ * Write the analysis-specific graph lines in the gnuplot script.
+ *
+ * Args:
+ * stream: stream where to write the data
+ * 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(FILE* stream, 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(stream,
+ "\t%7g + %7g * x "
+ "title \"Linreg conversion\" with lines "
+ "linecolor rgb \"gray60\" linetype 1, \\\n",
+ fit->d0, 1. + fit->x);
+}