X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fevent_processing_lttng_standard.c;h=cc9ada288353797096f954d5ea3361baf7840224;hb=467066eeab8b0a4e5ea07d24f1840310730fd470;hp=a8c08aaf05a1e2924d194e12c64933ba6a503965;hpb=f6691532b67cb6911749118e3da8d74de876380c;p=lttv.git diff --git a/lttv/lttv/sync/event_processing_lttng_standard.c b/lttv/lttv/sync/event_processing_lttng_standard.c index a8c08aaf..cc9ada28 100644 --- a/lttv/lttv/sync/event_processing_lttng_standard.c +++ b/lttv/lttv/sync/event_processing_lttng_standard.c @@ -29,7 +29,7 @@ #include #include -#include "sync_chain_lttv.h" +#include "sync_chain.h" #include "event_processing_lttng_common.h" #include "event_processing_lttng_standard.h" @@ -47,10 +47,10 @@ static void destroyProcessingLTTVStandard(SyncState* const syncState); static void finalizeProcessingLTTVStandard(SyncState* const syncState); static void printProcessingStatsLTTVStandard(SyncState* const syncState); -static void writeProcessingGraphsPlotsLTTVStandard(FILE* stream, SyncState* - const syncState, const unsigned int i, const unsigned int j); -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); +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))); @@ -64,12 +64,13 @@ static ProcessingModule processingModuleLTTVStandard = { .destroyProcessing= &destroyProcessingLTTVStandard, .finalizeProcessing= &finalizeProcessingLTTVStandard, .printProcessingStats= &printProcessingStatsLTTVStandard, - .writeProcessingGraphsPlots= &writeProcessingGraphsPlotsLTTVStandard, - .writeProcessingGraphsOptions= &writeProcessingGraphsOptionsLTTVStandard, + .graphFunctions= { + .writeTraceTraceOptions= &writeProcessingTraceTraceOptionsLTTVStandard, + .writeTraceTimeOptions= &writeProcessingTraceTimeOptionsLTTVStandard, + }, }; - /* * Processing Module registering function */ @@ -125,6 +126,24 @@ 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= 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, @@ -224,15 +243,14 @@ static void finalizeProcessingLTTVStandard(SyncState* const syncState) /* - * Print statistics related to processing and downstream modules. Must be - * called after finalizeProcessing. + * Print statistics related to processing Must be called after + * finalizeProcessing. * * Args: * syncState container for synchronization data. */ static void printProcessingStatsLTTVStandard(SyncState* const syncState) { - unsigned int i; ProcessingDataLTTVStandard* processingData; if (!syncState->stats) @@ -261,24 +279,6 @@ static void printProcessingStatsLTTVStandard(SyncState* const syncState) printf("\tsent packets that are TCP: %d\n", processingData->stats->totOutE); } - - if (syncState->matchingModule->printMatchingStats != NULL) - { - syncState->matchingModule->printMatchingStats(syncState); - } - - printf("Resulting synchronization factors:\n"); - for (i= 0; i < syncState->traceNb; i++) - { - LttTrace* t; - - t= processingData->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); - } } @@ -308,6 +308,11 @@ static void destroyProcessingLTTVStandard(SyncState* const syncState) free(processingData->stats); } + if (syncState->graphsStream) + { + free(processingData->graphs); + } + free(syncState->processingData); syncState->processingData= NULL; } @@ -370,8 +375,9 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) LttvTraceHook* traceHook; LttvTracefileContext* tfc; LttEvent* event; - LttTime time; LttCycleCount tsc; + LttTime time; + WallTime wTime; LttTrace* trace; unsigned long traceNum; struct marker_info* info; @@ -380,19 +386,21 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) traceHook= (LttvTraceHook*) hookData; tfc= (LttvTracefileContext*) callData; + trace= tfc->t_context->t; syncState= (SyncState*) traceHook->hook_data; processingData= (ProcessingDataLTTVStandard*) syncState->processingData; event= ltt_tracefile_get_event(tfc->tf); - time= ltt_event_time(event); - tsc= ltt_event_cycle_count(event); - trace= tfc->t_context->t; info= marker_get_info_from_id(tfc->tf->mdata, event->event_id); + tsc= ltt_event_cycle_count(event); + time= ltt_event_time(event); + wTime.seconds= time.tv_sec; + wTime.nanosec= time.tv_nsec; 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 ", - (long) time.tv_sec, time.tv_nsec, traceNum, trace, + time.tv_sec, time.tv_nsec, traceNum, trace, g_quark_to_string(info->name)); if (info->name == LTT_EVENT_DEV_XMIT_EXTENDED) @@ -419,18 +427,20 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) outE= malloc(sizeof(Event)); outE->traceNum= traceNum; - outE->time= tsc; + outE->cpuTime= tsc; + outE->wallTime= wTime; outE->type= TCP; + outE->copy= ©TCPEvent; outE->destroy= &destroyTCPEvent; outE->event.tcpEvent= malloc(sizeof(TCPEvent)); outE->event.tcpEvent->direction= OUT; outE->event.tcpEvent->segmentKey= malloc(sizeof(SegmentKey)); outE->event.tcpEvent->segmentKey->connectionKey.saddr= - ltt_event_get_unsigned(event, lttv_trace_get_hook_field(traceHook, - 3)); + htonl(ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 3))); outE->event.tcpEvent->segmentKey->connectionKey.daddr= - ltt_event_get_unsigned(event, lttv_trace_get_hook_field(traceHook, - 4)); + htonl(ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 4))); outE->event.tcpEvent->segmentKey->tot_len= ltt_event_get_unsigned(event, lttv_trace_get_hook_field(traceHook, 5)); @@ -486,8 +496,10 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) inE= malloc(sizeof(Event)); inE->traceNum= traceNum; - inE->time= tsc; + inE->cpuTime= tsc; + inE->wallTime= wTime; inE->event.tcpEvent= NULL; + inE->copy= ©Event; inE->destroy= &destroyEvent; skb= (void*) (long) ltt_event_get_long_unsigned(event, @@ -530,15 +542,16 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) inE->type= TCP; inE->event.tcpEvent= malloc(sizeof(TCPEvent)); + inE->copy= ©TCPEvent; inE->destroy= &destroyTCPEvent; inE->event.tcpEvent->direction= IN; inE->event.tcpEvent->segmentKey= malloc(sizeof(SegmentKey)); inE->event.tcpEvent->segmentKey->connectionKey.saddr= - ltt_event_get_unsigned(event, - lttv_trace_get_hook_field(traceHook, 1)); + htonl(ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 1))); inE->event.tcpEvent->segmentKey->connectionKey.daddr= - ltt_event_get_unsigned(event, - lttv_trace_get_hook_field(traceHook, 2)); + htonl(ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 2))); inE->event.tcpEvent->segmentKey->tot_len= ltt_event_get_unsigned(event, lttv_trace_get_hook_field(traceHook, 3)); @@ -608,15 +621,16 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) inE->type= UDP; inE->event.udpEvent= malloc(sizeof(UDPEvent)); + inE->copy= ©UDPEvent; inE->destroy= &destroyUDPEvent; inE->event.udpEvent->direction= IN; inE->event.udpEvent->datagramKey= malloc(sizeof(DatagramKey)); inE->event.udpEvent->datagramKey->saddr= - ltt_event_get_unsigned(event, - lttv_trace_get_hook_field(traceHook, 1)); + htonl(ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 1))); inE->event.udpEvent->datagramKey->daddr= - ltt_event_get_unsigned(event, - lttv_trace_get_hook_field(traceHook, 2)); + htonl(ltt_event_get_unsigned(event, + lttv_trace_get_hook_field(traceHook, 2))); inE->event.udpEvent->unicast= ltt_event_get_unsigned(event, lttv_trace_get_hook_field(traceHook, 3)) == 0 ? false : true; inE->event.udpEvent->datagramKey->ulen= @@ -661,59 +675,66 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) /* - * Write the processing-specific graph lines in the gnuplot script (none at - * the moment). Call the downstream module's graph function. + * 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 writeProcessingGraphsPlotsLTTVStandard(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) { - if (syncState->matchingModule->writeMatchingGraphsPlots != NULL) - { - syncState->matchingModule->writeMatchingGraphsPlots(stream, syncState, - i, 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 \"Clock %3$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 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->startFreq / traceI->freqScale, j, + (double) traceJ->startFreq / traceJ->freqScale); } /* - * Write the processing-specific options in the gnuplot script. Call the - * downstream module's options function. + * 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 writeProcessingTraceTimeOptionsLTTVStandard(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 \"time (s)\"\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 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); - - if (syncState->matchingModule->writeMatchingGraphsOptions != NULL) - { - syncState->matchingModule->writeMatchingGraphsOptions(stream, - syncState, i, j); - } + "set x2tics\n", i, (double) traceI->startFreq / traceI->freqScale); }