X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fevent_processing_lttng_standard.c;h=4b5f69ecd839c82ee37980034767d81411cdb4b0;hb=2f07659468ff3427bb3923cdc5a7ec61b6e8bbce;hp=8c20f975d4bdf054acb3b38455abc9feaa5934bd;hpb=d6ee500355b870e83d5cdbc431629999ec97794e;p=lttv.git diff --git a/lttv/lttv/sync/event_processing_lttng_standard.c b/lttv/lttv/sync/event_processing_lttng_standard.c index 8c20f975..4b5f69ec 100644 --- a/lttv/lttv/sync/event_processing_lttng_standard.c +++ b/lttv/lttv/sync/event_processing_lttng_standard.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -35,20 +36,18 @@ #include "event_processing_lttng_standard.h" -#ifndef g_info -#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) -#endif - - // Functions common to all processing modules -static void initProcessingLTTVStandard(SyncState* const syncState, - LttvTracesetContext* const traceSetContext); +static void initProcessingLTTVStandard(SyncState* const syncState, ...); static void destroyProcessingLTTVStandard(SyncState* const syncState); static void finalizeProcessingLTTVStandard(SyncState* const syncState); static void printProcessingStatsLTTVStandard(SyncState* const syncState); -static void writeProcessingGraphsOptionsLTTVStandard(FILE* stream, SyncState* - const syncState, const unsigned int i, const unsigned int j); +static void writeProcessingGraphVariablesLTTVStandard(SyncState* const + syncState, const unsigned int i); +static void writeProcessingTraceTraceOptionsLTTVStandard(SyncState* const + syncState, const unsigned int i, const unsigned int j); +static void writeProcessingTraceTimeOptionsLTTVStandard(SyncState* const + syncState, const unsigned int i, const unsigned int j); // Functions specific to this module static void registerProcessingLTTVStandard() __attribute__((constructor (102))); @@ -62,12 +61,14 @@ static ProcessingModule processingModuleLTTVStandard = { .destroyProcessing= &destroyProcessingLTTVStandard, .finalizeProcessing= &finalizeProcessingLTTVStandard, .printProcessingStats= &printProcessingStatsLTTVStandard, - .writeProcessingGraphsPlots= NULL, - .writeProcessingGraphsOptions= &writeProcessingGraphsOptionsLTTVStandard, + .graphFunctions= { + .writeVariables= &writeProcessingGraphVariablesLTTVStandard, + .writeTraceTraceOptions= &writeProcessingTraceTraceOptionsLTTVStandard, + .writeTraceTimeOptions= &writeProcessingTraceTimeOptionsLTTVStandard, + }, }; - /* * Processing Module registering function */ @@ -90,17 +91,19 @@ static void registerProcessingLTTVStandard() * pendingRecv * hookListList * stats - * traceSetContext: set of LTTV traces + * traceSetContext: LttvTracesetContext*, set of LTTV traces */ -static void initProcessingLTTVStandard(SyncState* const syncState, LttvTracesetContext* - const traceSetContext) +static void initProcessingLTTVStandard(SyncState* const syncState, ...) { unsigned int i; ProcessingDataLTTVStandard* processingData; + va_list ap; processingData= malloc(sizeof(ProcessingDataLTTVStandard)); syncState->processingData= processingData; - processingData->traceSetContext= traceSetContext; + va_start(ap, syncState); + processingData->traceSetContext= va_arg(ap, LttvTracesetContext*); + va_end(ap); if (syncState->stats) { @@ -123,14 +126,32 @@ static void initProcessingLTTVStandard(SyncState* const syncState, LttvTracesetC processingData->traceSetContext->traces[i]->t, (gpointer) i); } + if (syncState->graphsStream) + { + processingData->graphs= malloc(syncState->traceNb * + sizeof(ProcessingGraphsLTTVStandard)); + + for(i= 0; i < syncState->traceNb; i++) + { + LttTrace* traceI= processingData->traceSetContext->traces[i]->t; + + processingData->graphs[i].startFreq= traceI->start_freq; + processingData->graphs[i].freqScale= traceI->freq_scale; + } + } + else + { + processingData->graphs= NULL; + } + for(i= 0; i < syncState->traceNb; i++) { processingData->pendingRecv[i]= g_hash_table_new_full(&g_direct_hash, NULL, NULL, &gdnDestroyEvent); } - registerHooks(processingData->hookListList, traceSetContext, - &processEventLTTVStandard, syncState, + registerHooks(processingData->hookListList, + processingData->traceSetContext, &processEventLTTVStandard, syncState, syncState->matchingModule->canMatch); } @@ -213,7 +234,7 @@ static void finalizeProcessingLTTVStandard(SyncState* const syncState) lttv_traceset_context_compute_time_span(processingData->traceSetContext, &processingData->traceSetContext->time_span); - g_debug("traceset start %ld.%09ld end %ld.%09ld\n", + g_debug("traceset start %ld.%09ld end %ld.%09ld", processingData->traceSetContext->time_span.start_time.tv_sec, processingData->traceSetContext->time_span.start_time.tv_nsec, processingData->traceSetContext->time_span.end_time.tv_sec, @@ -287,6 +308,11 @@ static void destroyProcessingLTTVStandard(SyncState* const syncState) free(processingData->stats); } + if (syncState->graphsStream) + { + free(processingData->graphs); + } + free(syncState->processingData); syncState->processingData= NULL; } @@ -323,7 +349,7 @@ static void partialDestroyProcessingLTTVStandard(SyncState* const syncState) for(i= 0; i < syncState->traceNb; i++) { - g_debug("Cleaning up pendingRecv list\n"); + g_debug("Cleaning up pendingRecv list"); g_hash_table_destroy(processingData->pendingRecv[i]); } free(processingData->pendingRecv); @@ -373,7 +399,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) g_assert(g_hash_table_lookup_extended(processingData->traceNumTable, trace, NULL, (gpointer*) &traceNum)); - g_debug("XXXX process event: time: %ld.%09ld trace: %ld (%p) name: %s ", + g_debug("Process event: time: %ld.%09ld trace: %ld (%p) name: %s ", time.tv_sec, time.tv_nsec, traceNum, trace, g_quark_to_string(info->name)); @@ -444,7 +470,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) syncState->matchingModule->matchEvent(syncState, outE); - g_debug("Output event done\n"); + g_debug("Output event done"); } else if (info->name == LTT_EVENT_DEV_RECEIVE) { @@ -481,11 +507,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) g_hash_table_replace(processingData->pendingRecv[traceNum], skb, inE); - g_debug("Adding inE %p for skb %p to pendingRecv\n", inE, skb); - } - else - { - g_debug("\n"); + g_debug("Adding inE %p for skb %p to pendingRecv", inE, skb); } } else if (info->name == LTT_EVENT_TCPV4_RCV_EXTENDED) @@ -562,7 +584,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) syncState->matchingModule->matchEvent(syncState, inE); - g_debug("TCP input event %p for skb %p done\n", inE, skb); + g_debug("TCP input event %p for skb %p done", inE, skb); } } else if (info->name == LTT_EVENT_UDPV4_RCV_EXTENDED) @@ -636,7 +658,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) syncState->matchingModule->matchEvent(syncState, inE); - g_debug("UDP input event %p for skb %p done\n", inE, skb); + g_debug("UDP input event %p for skb %p done", inE, skb); } } else @@ -648,37 +670,84 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) } +/* + * Write the processing-specific variables in the gnuplot script. + * + * Args: + * syncState: container for synchronization data + * i: trace number + */ +static void writeProcessingGraphVariablesLTTVStandard(SyncState* const + syncState, const unsigned int i) +{ + ProcessingDataLTTVStandard* processingData= syncState->processingData; + ProcessingGraphsLTTVStandard* traceI= &processingData->graphs[i]; + + fprintf(syncState->graphsStream, "clock_freq_%u= %.3f\n", i, (double) + traceI->startFreq / traceI->freqScale); +} + + /* * Write the processing-specific options in the gnuplot script. * * Args: - * stream: stream where to write the data * syncState: container for synchronization data * i: first trace number * j: second trace number, garanteed to be larger than i */ -static void writeProcessingGraphsOptionsLTTVStandard(FILE* stream, SyncState* - const syncState, const unsigned int i, const unsigned int j) +static void writeProcessingTraceTraceOptionsLTTVStandard(SyncState* const + syncState, const unsigned int i, const unsigned int j) { ProcessingDataLTTVStandard* processingData; - LttTrace* traceI, * traceJ; + ProcessingGraphsLTTVStandard* traceI, * traceJ; processingData= (ProcessingDataLTTVStandard*) syncState->processingData; - traceI= processingData->traceSetContext->traces[i]->t; - traceJ= processingData->traceSetContext->traces[j]->t; + traceI= &processingData->graphs[i]; + traceJ= &processingData->graphs[j]; - fprintf(stream, + fprintf(syncState->graphsStream, "set key inside right bottom\n" "set xlabel \"Clock %1$u\"\n" "set xtics nomirror\n" - "set ylabel \"Clock %3$u\"\n" + "set ylabel \"Clock %2$u\"\n" "set ytics nomirror\n" "set x2label \"Clock %1$d (s)\"\n" - "set x2range [GPVAL_X_MIN / %2$.1f : GPVAL_X_MAX / %2$.1f]\n" + "set x2range [GPVAL_X_MIN / clock_freq_%1$u : GPVAL_X_MAX / clock_freq_%1$u]\n" "set x2tics\n" - "set y2label \"Clock %3$d (s)\"\n" - "set y2range [GPVAL_Y_MIN / %4$.1f : GPVAL_Y_MAX / %4$.1f]\n" - "set y2tics\n", i, (double) traceI->start_freq / traceI->freq_scale, - j, (double) traceJ->start_freq / traceJ->freq_scale); + "set y2label \"Clock %2$d (s)\"\n" + "set y2range [GPVAL_Y_MIN / clock_freq_%2$u : GPVAL_Y_MAX / clock_freq_%2$u]\n" + "set y2tics\n", i, j); +} + + +/* + * Write the processing-specific options 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 writeProcessingTraceTimeOptionsLTTVStandard(SyncState* const + syncState, const unsigned int i, const unsigned int j) +{ + ProcessingDataLTTVStandard* processingData; + ProcessingGraphsLTTVStandard* traceI, * traceJ; + + processingData= (ProcessingDataLTTVStandard*) syncState->processingData; + + traceI= &processingData->graphs[i]; + traceJ= &processingData->graphs[j]; + + fprintf(syncState->graphsStream, + "set key inside right bottom\n" + "set xlabel \"Clock %1$u\"\n" + "set xtics nomirror\n" + "set ylabel \"time (s)\"\n" + "set ytics nomirror\n" + "set x2label \"Clock %1$d (s)\"\n" + "set x2range [GPVAL_X_MIN / clock_freq_%1$u : GPVAL_X_MAX / clock_freq_%1$u]\n" + "set x2tics\n", i); }