From: Benjamin Poirier Date: Tue, 16 Mar 2010 20:14:10 +0000 (-0400) Subject: Set the correction factors in the sync_chain X-Git-Tag: 0.12.32~28 X-Git-Url: http://git.liburcu.org/?p=lttv.git;a=commitdiff_plain;h=9c7696b8589e76aed870b15cabd09a162d468621 Set the correction factors in the sync_chain ... instead of in the event_processing. Using the correction factors, at least through lttv, is specific to the viewer, not the trace type. The sync chain is the part that contains code specific to a viewer. Signed-off-by: Benjamin Poirier --- diff --git a/lttv/lttv/sync/event_analysis_linreg.c b/lttv/lttv/sync/event_analysis_linreg.c index 0cab480b..bda89874 100644 --- a/lttv/lttv/sync/event_analysis_linreg.c +++ b/lttv/lttv/sync/event_analysis_linreg.c @@ -421,7 +421,7 @@ static void doGraphProcessing(SyncState* const syncState) graph= (Graph*) result->data; if (errorSum < graph->errorSum) { - g_debug("adding to graph"); + g_debug("new reference"); graph->errorSum= errorSum; free(graph->previousVertex); graph->previousVertex= previousVertex; diff --git a/lttv/lttv/sync/event_processing.h b/lttv/lttv/sync/event_processing.h index 876ca1d7..5ed1d91c 100644 --- a/lttv/lttv/sync/event_processing.h +++ b/lttv/lttv/sync/event_processing.h @@ -32,7 +32,7 @@ typedef struct char* name; void (*initProcessing)(struct _SyncState* const syncStateLttv, ...); - void (*finalizeProcessing)(struct _SyncState* const syncState); + GArray* (*finalizeProcessing)(struct _SyncState* const syncState); void (*printProcessingStats)(struct _SyncState* const syncState); void (*destroyProcessing)(struct _SyncState* const syncState); GraphFunctions graphFunctions; diff --git a/lttv/lttv/sync/event_processing_lttng_null.c b/lttv/lttv/sync/event_processing_lttng_null.c index 3f4c64c5..b9eecbf3 100644 --- a/lttv/lttv/sync/event_processing_lttng_null.c +++ b/lttv/lttv/sync/event_processing_lttng_null.c @@ -32,7 +32,7 @@ static void initProcessingLTTVNull(SyncState* const syncState, ...); static void destroyProcessingLTTVNull(SyncState* const syncState); -static void finalizeProcessingLTTVNull(SyncState* const syncState); +static GArray* finalizeProcessingLTTVNull(SyncState* const syncState); // Functions specific to this module static gboolean processEventLTTVNull(void* hookData, void* callData); @@ -94,10 +94,14 @@ static void initProcessingLTTVNull(SyncState* const syncState, ...) * * Args: * syncState container for synchronization data. + * + * Returns: + * Factors[traceNb] synchronization factors for each trace, empty in this + * case */ -static void finalizeProcessingLTTVNull(SyncState* const syncState) +static GArray* finalizeProcessingLTTVNull(SyncState* const syncState) { - return; + return g_array_new(FALSE, FALSE, sizeof(Factors)); } diff --git a/lttv/lttv/sync/event_processing_lttng_standard.c b/lttv/lttv/sync/event_processing_lttng_standard.c index 99086fe5..02354043 100644 --- a/lttv/lttv/sync/event_processing_lttng_standard.c +++ b/lttv/lttv/sync/event_processing_lttng_standard.c @@ -15,13 +15,10 @@ * along with this program. If not, see . */ -#define _ISOC99_SOURCE - #ifdef HAVE_CONFIG_H #include #endif -#include #include #include #include @@ -43,7 +40,7 @@ static void initProcessingLTTVStandard(SyncState* const syncState, ...); static void destroyProcessingLTTVStandard(SyncState* const syncState); -static void finalizeProcessingLTTVStandard(SyncState* const syncState); +static GArray* finalizeProcessingLTTVStandard(SyncState* const syncState); static void printProcessingStatsLTTVStandard(SyncState* const syncState); static void writeProcessingGraphVariablesLTTVStandard(SyncState* const syncState, const unsigned int i); @@ -166,83 +163,19 @@ static void initProcessingLTTVStandard(SyncState* const syncState, ...) * * Args: * syncState container for synchronization data. + * + * Returns: + * Factors[traceNb] synchronization factors for each trace */ -static void finalizeProcessingLTTVStandard(SyncState* const syncState) +static GArray* finalizeProcessingLTTVStandard(SyncState* const syncState) { - unsigned int i; - GArray* factors; - double minOffset, minDrift; - unsigned int refFreqTrace; ProcessingDataLTTVStandard* processingData; processingData= (ProcessingDataLTTVStandard*) syncState->processingData; partialDestroyProcessingLTTVStandard(syncState); - factors= syncState->matchingModule->finalizeMatching(syncState); - - /* The offsets are adjusted so the lowest one is 0. This is done because - * of a Lttv specific limitation: events cannot have negative times. By - * having non-negative offsets, events cannot be moved backwards to - * negative times. - */ - minOffset= 0; - for (i= 0; i < syncState->traceNb; i++) - { - minOffset= MIN(g_array_index(factors, Factors, i).offset, minOffset); - } - - for (i= 0; i < syncState->traceNb; i++) - { - g_array_index(factors, Factors, i).offset-= minOffset; - } - - /* Because the timestamps are corrected at the TSC level (not at the - * LttTime level) all trace frequencies must be made equal. We choose to - * use the frequency of the system with the lowest drift - */ - minDrift= INFINITY; - refFreqTrace= 0; - for (i= 0; i < syncState->traceNb; i++) - { - if (g_array_index(factors, Factors, i).drift < minDrift) - { - minDrift= g_array_index(factors, Factors, i).drift; - refFreqTrace= i; - } - } - g_assert(syncState->traceNb == 0 || minDrift != INFINITY); - - // Write the factors to the LttTrace structures - for (i= 0; i < syncState->traceNb; i++) - { - LttTrace* t; - Factors* traceFactors; - - t= processingData->traceSetContext->traces[i]->t; - traceFactors= &g_array_index(factors, Factors, i); - - t->drift= traceFactors->drift; - t->offset= traceFactors->offset; - t->start_freq= - processingData->traceSetContext->traces[refFreqTrace]->t->start_freq; - t->freq_scale= - processingData->traceSetContext->traces[refFreqTrace]->t->freq_scale; - t->start_time_from_tsc = - ltt_time_from_uint64(tsc_to_uint64(t->freq_scale, t->start_freq, - t->drift * t->start_tsc + t->offset)); - } - - g_array_free(factors, TRUE); - - lttv_traceset_context_compute_time_span(processingData->traceSetContext, - &processingData->traceSetContext->time_span); - - 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, - processingData->traceSetContext->time_span.end_time.tv_nsec); + return syncState->matchingModule->finalizeMatching(syncState); } diff --git a/lttv/lttv/sync/event_processing_text.c b/lttv/lttv/sync/event_processing_text.c index 8268d823..37f4194e 100644 --- a/lttv/lttv/sync/event_processing_text.c +++ b/lttv/lttv/sync/event_processing_text.c @@ -37,7 +37,7 @@ // Functions common to all processing modules static void initProcessingText(SyncState* const syncState, ...); static void destroyProcessingText(SyncState* const syncState); -static void finalizeProcessingText(SyncState* const syncState); +static GArray* finalizeProcessingText(SyncState* const syncState); static void printProcessingStatsText(SyncState* const syncState); static void writeProcessingTraceTimeOptionsText(SyncState* const syncState, const unsigned int i, const unsigned int j); @@ -136,8 +136,11 @@ static void destroyProcessingText(SyncState* const syncState) * * Args: * syncState: container for synchronization data. + * + * Returns: + * Factors[traceNb] synchronization factors for each trace */ -static void finalizeProcessingText(SyncState* const syncState) +static GArray* finalizeProcessingText(SyncState* const syncState) { int retval; unsigned int* seq; @@ -277,10 +280,8 @@ static void finalizeProcessingText(SyncState* const syncState) { processingData->factors= factors; } - else - { - g_array_free(factors, TRUE); - } + + return factors; } diff --git a/lttv/lttv/sync/sync_chain.c b/lttv/lttv/sync/sync_chain.c index 4c73f9bc..be915b08 100644 --- a/lttv/lttv/sync/sync_chain.c +++ b/lttv/lttv/sync/sync_chain.c @@ -33,7 +33,7 @@ GQueue moduleOptions= G_QUEUE_INIT; /* - * Calculate the elapsed time between two timeval values + * Call the statistics function of each module of a sync chain * * Args: * syncState: Container for synchronization data diff --git a/lttv/lttv/sync/sync_chain_lttv.c b/lttv/lttv/sync/sync_chain_lttv.c index c0693b7e..0180e3b0 100644 --- a/lttv/lttv/sync/sync_chain_lttv.c +++ b/lttv/lttv/sync/sync_chain_lttv.c @@ -15,12 +15,15 @@ * along with this program. If not, see . */ +#define _ISOC99_SOURCE + #ifdef HAVE_CONFIG_H #include #endif #include #include +#include #include #include #include @@ -178,6 +181,9 @@ bool syncTraceset(LttvTracesetContext* const traceSetContext) struct rusage startUsage, endUsage; GList* result; unsigned int i; + GArray* factors; + double minOffset, minDrift; + unsigned int refFreqTrace; int retval; if (!optionSync.present) @@ -262,7 +268,69 @@ bool syncTraceset(LttvTracesetContext* const traceSetContext) G_MAXULONG, NULL); lttv_process_traceset_seek_time(traceSetContext, ltt_time_zero); - syncState->processingModule->finalizeProcessing(syncState); + // Obtain, adjust and set correction factors + factors= syncState->processingModule->finalizeProcessing(syncState); + + /* The offsets are adjusted so the lowest one is 0. This is done because + * of a Lttv specific limitation: events cannot have negative times. By + * having non-negative offsets, events cannot be moved backwards to + * negative times. + */ + minOffset= 0; + for (i= 0; i < syncState->traceNb; i++) + { + minOffset= MIN(g_array_index(factors, Factors, i).offset, minOffset); + } + + for (i= 0; i < syncState->traceNb; i++) + { + g_array_index(factors, Factors, i).offset-= minOffset; + } + + /* Because the timestamps are corrected at the TSC level (not at the + * LttTime level) all trace frequencies must be made equal. We use the + * frequency of the system with the lowest drift + */ + minDrift= INFINITY; + refFreqTrace= 0; + for (i= 0; i < syncState->traceNb; i++) + { + if (g_array_index(factors, Factors, i).drift < minDrift) + { + minDrift= g_array_index(factors, Factors, i).drift; + refFreqTrace= i; + } + } + g_assert(syncState->traceNb == 0 || minDrift != INFINITY); + + // Write the factors to the LttTrace structures + for (i= 0; i < syncState->traceNb; i++) + { + LttTrace* t; + Factors* traceFactors; + + t= traceSetContext->traces[i]->t; + traceFactors= &g_array_index(factors, Factors, i); + + t->drift= traceFactors->drift; + t->offset= traceFactors->offset; + t->start_freq= traceSetContext->traces[refFreqTrace]->t->start_freq; + t->freq_scale= traceSetContext->traces[refFreqTrace]->t->freq_scale; + t->start_time_from_tsc = + ltt_time_from_uint64(tsc_to_uint64(t->freq_scale, t->start_freq, + t->drift * t->start_tsc + t->offset)); + } + + g_array_free(factors, TRUE); + + lttv_traceset_context_compute_time_span(traceSetContext, + &traceSetContext->time_span); + + g_debug("traceset start %ld.%09ld end %ld.%09ld", + traceSetContext->time_span.start_time.tv_sec, + traceSetContext->time_span.start_time.tv_nsec, + traceSetContext->time_span.end_time.tv_sec, + traceSetContext->time_span.end_time.tv_nsec); // Write graphs file if (!optionSyncNull.present && optionSyncGraphs.present) diff --git a/lttv/lttv/sync/sync_chain_unittest.c b/lttv/lttv/sync/sync_chain_unittest.c index 9916591c..50c9f395 100644 --- a/lttv/lttv/sync/sync_chain_unittest.c +++ b/lttv/lttv/sync/sync_chain_unittest.c @@ -105,6 +105,7 @@ int main(const int argc, char* const argv[]) const char* testCaseName; GString* analysisModulesNames; unsigned int id; + GArray* factors; /* * Initialize event modules @@ -207,7 +208,8 @@ int main(const int argc, char* const argv[]) syncState->analysisModule->initAnalysis(syncState); // Process traceset - syncState->processingModule->finalizeProcessing(syncState); + factors= syncState->processingModule->finalizeProcessing(syncState); + g_array_free(factors, TRUE); // Write graphs file if (syncState->graphsStream)