X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=lttv%2Flttv%2Fsync%2Fevent_processing_lttng_standard.c;h=ec2a6a924e5a6d267fef6c8adc4c3e3d26449509;hb=7b20eed1e2a33658249baf49488b6c93028639f9;hp=4b5f69ecd839c82ee37980034767d81411cdb4b0;hpb=2f07659468ff3427bb3923cdc5a7ec61b6e8bbce;p=lttv.git diff --git a/lttv/lttv/sync/event_processing_lttng_standard.c b/lttv/lttv/sync/event_processing_lttng_standard.c index 4b5f69ec..ec2a6a92 100644 --- a/lttv/lttv/sync/event_processing_lttng_standard.c +++ b/lttv/lttv/sync/event_processing_lttng_standard.c @@ -1,29 +1,24 @@ /* This file is part of the Linux Trace Toolkit viewer - * Copyright (C) 2009 Benjamin Poirier + * Copyright (C) 2009, 2010 Benjamin Poirier * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License Version 2 as - * published by the Free Software Foundation; + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 2.1 of the License, or (at + * your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, - * MA 02111-1307, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ -#define _ISOC99_SOURCE - #ifdef HAVE_CONFIG_H #include #endif -#include -#include #include #include #include @@ -35,12 +30,17 @@ #include "event_processing_lttng_standard.h" +/* IPv4 Ethertype, taken from , unlikely to change as it's + * defined by IANA: http://www.iana.org/assignments/ethernet-numbers + */ +#define ETH_P_IP 0x0800 + // Functions common to all processing modules static void initProcessingLTTVStandard(SyncState* const syncState, ...); static void destroyProcessingLTTVStandard(SyncState* const syncState); -static void finalizeProcessingLTTVStandard(SyncState* const syncState); +static AllFactors* finalizeProcessingLTTVStandard(SyncState* const syncState); static void printProcessingStatsLTTVStandard(SyncState* const syncState); static void writeProcessingGraphVariablesLTTVStandard(SyncState* const syncState, const unsigned int i); @@ -50,7 +50,6 @@ 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))); static gboolean processEventLTTVStandard(void* hookData, void* callData); static void partialDestroyProcessingLTTVStandard(SyncState* const syncState); @@ -72,7 +71,7 @@ static ProcessingModule processingModuleLTTVStandard = { /* * Processing Module registering function */ -static void registerProcessingLTTVStandard() +void registerProcessingLTTVStandard() { g_queue_push_tail(&processingModules, &processingModuleLTTVStandard); @@ -104,26 +103,34 @@ static void initProcessingLTTVStandard(SyncState* const syncState, ...) va_start(ap, syncState); processingData->traceSetContext= va_arg(ap, LttvTracesetContext*); va_end(ap); + syncState->traceNb= + lttv_traceset_number(processingData->traceSetContext->ts); + processingData->hookListList= g_array_sized_new(FALSE, FALSE, + sizeof(GArray*), syncState->traceNb); - if (syncState->stats) - { - processingData->stats= calloc(1, sizeof(ProcessingStatsLTTVStandard)); - } - else + processingData->traceNumTable= g_hash_table_new(&g_direct_hash, NULL); + for(i= 0; i < syncState->traceNb; i++) { - processingData->stats= NULL; + g_hash_table_insert(processingData->traceNumTable, + processingData->traceSetContext->traces[i]->t, + GUINT_TO_POINTER(i)); } - processingData->traceNumTable= g_hash_table_new(&g_direct_hash, NULL); - processingData->hookListList= g_array_sized_new(FALSE, FALSE, - sizeof(GArray*), syncState->traceNb); processingData->pendingRecv= malloc(sizeof(GHashTable*) * syncState->traceNb); - for(i= 0; i < syncState->traceNb; i++) { - g_hash_table_insert(processingData->traceNumTable, - processingData->traceSetContext->traces[i]->t, (gpointer) i); + processingData->pendingRecv[i]= g_hash_table_new_full(&g_direct_hash, + NULL, NULL, &gdnDestroyEvent); + } + + if (syncState->stats) + { + processingData->stats= calloc(1, sizeof(ProcessingStatsLTTVStandard)); + } + else + { + processingData->stats= NULL; } if (syncState->graphsStream) @@ -144,12 +151,6 @@ static void initProcessingLTTVStandard(SyncState* const syncState, ...) 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, processingData->traceSetContext, &processEventLTTVStandard, syncState, syncState->matchingModule->canMatch); @@ -157,93 +158,25 @@ static void initProcessingLTTVStandard(SyncState* const syncState, ...) /* - * Call the partial processing destroyer, obtain and adjust the factors from + * Call the partial processing destroyer, obtain and the factors from * downstream * * Args: * syncState container for synchronization data. + * + * Returns: + * AllFactors synchronization factors for each trace pair */ -static void finalizeProcessingLTTVStandard(SyncState* const syncState) +static AllFactors* 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); } /* - * Print statistics related to processing Must be called after + * Print statistics related to processing. Must be called after * finalizeProcessing. * * Args: @@ -383,6 +316,7 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) struct marker_info* info; SyncState* syncState; ProcessingDataLTTVStandard* processingData; + gpointer traceNumP; traceHook= (LttvTraceHook*) hookData; tfc= (LttvTracefileContext*) callData; @@ -397,7 +331,8 @@ static gboolean processEventLTTVStandard(void* hookData, void* callData) wTime.nanosec= time.tv_nsec; g_assert(g_hash_table_lookup_extended(processingData->traceNumTable, - trace, NULL, (gpointer*) &traceNum)); + trace, NULL, &traceNumP)); + traceNum= GPOINTER_TO_INT(traceNumP); g_debug("Process event: time: %ld.%09ld trace: %ld (%p) name: %s ", time.tv_sec, time.tv_nsec, traceNum, trace, @@ -699,14 +634,6 @@ static void writeProcessingGraphVariablesLTTVStandard(SyncState* const static void writeProcessingTraceTraceOptionsLTTVStandard(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" @@ -733,14 +660,6 @@ static void writeProcessingTraceTraceOptionsLTTVStandard(SyncState* const 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"