Add support for module options
authorBenjamin Poirier <benjamin.poirier@polymtl.ca>
Fri, 30 Oct 2009 23:09:26 +0000 (19:09 -0400)
committerBenjamin Poirier <benjamin.poirier@polymtl.ca>
Fri, 18 Dec 2009 19:03:25 +0000 (14:03 -0500)
This is independant (down to sync_chain) of lttv's option mechanism.

Signed-off-by: Benjamin Poirier <benjamin.poirier@polymtl.ca>
16 files changed:
lttv/lttv/sync/data_structures.h
lttv/lttv/sync/event_analysis_chull.c
lttv/lttv/sync/event_analysis_eval.c
lttv/lttv/sync/event_analysis_eval.h
lttv/lttv/sync/event_analysis_linreg.c
lttv/lttv/sync/event_matching_broadcast.c
lttv/lttv/sync/event_matching_tcp.c
lttv/lttv/sync/event_processing_lttng_null.c
lttv/lttv/sync/event_processing_lttng_standard.c
lttv/lttv/sync/sync_chain.h [new file with mode: 0644]
lttv/lttv/sync/sync_chain_lttv.c
lttv/lttv/sync/sync_chain_lttv.h [deleted file]
lttv/lttv/sync/unittest.c
lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c
lttv/modules/text/batchAnalysis.c
lttv/modules/text/sync_chain_batch.c

index 62a776a8847ba3f5fc8b81c368493ccbb147918f..719f664d2ce8b6c4dadf62917cf5a6b5790d487d 100644 (file)
@@ -36,7 +36,7 @@ enum EventType
 {
        TCP,
        UDP,
-       TYPE_COUNT, // This must be the last field
+       TYPE_COUNT // This must be the last field
 };
 
 // Stage 1 to 2: These structures are passed from processing to matching modules
index 34630941a23b6f85e829cf3a048541fe12454945..6f6e3090b1a4623ecff79b9280c26e628a73dea7 100644 (file)
@@ -28,7 +28,7 @@
 #include <stdio.h>
 #include <unistd.h>
 
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 
 #include "event_analysis_chull.h"
 
index 9ee0f47f08d2776d6f4923748088d420396ca9f1..05a49acca39c9c1114245e53a9e2c6b6f87fd6cb 100644 (file)
  * MA 02111-1307, USA.
  */
 
+#define _GNU_SOURCE
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
+#include <arpa/inet.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <stddef.h>
 #include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/socket.h>
 
-#include "sync_chain_lttv.h"
+#include "lookup3.h"
+#include "sync_chain.h"
 
 #include "event_analysis_eval.h"
 
@@ -42,6 +52,12 @@ static void printAnalysisStatsEval(SyncState* const syncState);
 
 // Functions specific to this module
 static void registerAnalysisEval() __attribute__((constructor (102)));
+static guint ghfRttKeyHash(gconstpointer key);
+static gboolean gefRttKeyEqual(gconstpointer a, gconstpointer b);
+static void gdnDestroyRttKey(gpointer data);
+static void gdnDestroyDouble(gpointer data);
+static void readRttInfo(GHashTable* rttInfo, FILE* rttFile);
+static void positionStream(FILE* stream);
 
 
 static AnalysisModule analysisModuleEval= {
@@ -57,6 +73,14 @@ static AnalysisModule analysisModuleEval= {
        .writeAnalysisGraphsOptions= NULL,
 };
 
+static ModuleOption optionEvalRttFile= {
+       .longName= "eval-rtt-file",
+       .hasArg= REQUIRED_ARG,
+       {.arg= NULL},
+       .optionHelp= "specify the file containing rtt information",
+       .argHelp= "FILE",
+};
+
 
 /*
  * Analysis module registering function
@@ -64,6 +88,7 @@ static AnalysisModule analysisModuleEval= {
 static void registerAnalysisEval()
 {
        g_queue_push_tail(&analysisModules, &analysisModuleEval);
+       g_queue_push_tail(&moduleOptions, &optionEvalRttFile);
 }
 
 
@@ -84,7 +109,27 @@ static void initAnalysisEval(SyncState* const syncState)
        analysisData= malloc(sizeof(AnalysisDataEval));
        syncState->analysisData= analysisData;
 
-       //readRttInfo(&analysisData->rttInfo, optionEvalRttFile);
+       analysisData->rttInfo= g_hash_table_new_full(&ghfRttKeyHash,
+               &gefRttKeyEqual, &gdnDestroyRttKey, &gdnDestroyDouble);
+       if (optionEvalRttFile.arg)
+       {
+               FILE* rttStream;
+               int retval;
+
+               rttStream= fopen(optionEvalRttFile.arg, "r");
+               if (rttStream == NULL)
+               {
+                       g_error(strerror(errno));
+               }
+
+               readRttInfo(analysisData->rttInfo, rttStream);
+
+               retval= fclose(rttStream);
+               if (retval == EOF)
+               {
+                       g_error(strerror(errno));
+               }
+       }
 
        if (syncState->stats)
        {
@@ -122,7 +167,7 @@ static void destroyAnalysisEval(SyncState* const syncState)
                return;
        }
 
-       //g_hash_table_destroy(analysisData->rttInfo);
+       g_hash_table_destroy(analysisData->rttInfo);
        analysisData->rttInfo= NULL;
 
        if (syncState->stats)
@@ -263,3 +308,215 @@ static void printAnalysisStatsEval(SyncState* const syncState)
                }
        }
 }
+
+
+/*
+ * A GHashFunc for g_hash_table_new()
+ *
+ * Args:
+ *    key        struct RttKey*
+ */
+static guint ghfRttKeyHash(gconstpointer key)
+{
+       struct RttKey* rttKey;
+       uint32_t a, b, c;
+
+       rttKey= (struct RttKey*) key;
+
+       a= rttKey->saddr;
+       b= rttKey->daddr;
+       c= 0;
+       final(a, b, c);
+
+       return c;
+}
+
+
+/*
+ * A GDestroyNotify function for g_hash_table_new_full()
+ *
+ * Args:
+ *   data:         struct RttKey*
+ */
+static void gdnDestroyRttKey(gpointer data)
+{
+       free(data);
+}
+
+
+/*
+ * A GDestroyNotify function for g_hash_table_new_full()
+ *
+ * Args:
+ *   data:         double*
+ */
+static void gdnDestroyDouble(gpointer data)
+{
+       free(data);
+}
+
+
+/*
+ * A GEqualFunc for g_hash_table_new()
+ *
+ * Args:
+ *   a, b          RttKey*
+ *
+ * Returns:
+ *   TRUE if both values are equal
+ */
+static gboolean gefRttKeyEqual(gconstpointer a, gconstpointer b)
+{
+       const struct RttKey* rkA, * rkB;
+
+       rkA= (struct RttKey*) a;
+       rkB= (struct RttKey*) b;
+
+       if (rkA->saddr == rkB->saddr && rkA->daddr == rkB->daddr)
+       {
+               return TRUE;
+       }
+       else
+       {
+               return FALSE;
+       }
+}
+
+
+/*
+ * Read a file contain minimum round trip time values and fill an array with
+ * them. The file is formatted as such:
+ * <host1 IP> <host2 IP> <RTT in milliseconds>
+ * ip's should be in dotted quad format
+ *
+ * Args:
+ *   rttInfo:      double* rttInfo[RttKey], empty table, will be filled
+ *   rttStream:      stream from which to read
+ */
+static void readRttInfo(GHashTable* rttInfo, FILE* rttStream)
+{
+       char* line= NULL;
+       size_t len;
+       int retval;
+
+       positionStream(rttStream);
+       retval= getline(&line, &len, rttStream);
+       while(!feof(rttStream))
+       {
+               struct RttKey* rttKey;
+               char saddrDQ[20], daddrDQ[20];
+               double* rtt;
+               char tmp;
+               struct in_addr addr;
+               unsigned int i;
+               struct {
+                       char* dq;
+                       size_t offset;
+               } loopValues[] = {
+                       {saddrDQ, offsetof(struct RttKey, saddr)},
+                       {daddrDQ, offsetof(struct RttKey, daddr)}
+               };
+
+               if (retval == -1 && !feof(rttStream))
+               {
+                       g_error(strerror(errno));
+               }
+
+               if (line[retval - 1] == '\n')
+               {
+                       line[retval - 1]= '\0';
+               }
+
+               rtt= malloc(sizeof(double));
+               retval= sscanf(line, " %19s %19s %lf %c", saddrDQ, daddrDQ, rtt,
+                       &tmp);
+               if (retval == EOF)
+               {
+                       g_error(strerror(errno));
+               }
+               else if (retval != 3)
+               {
+                       g_error("Error parsing RTT file, line was '%s'", line);
+               }
+
+               rttKey= malloc(sizeof(struct RttKey));
+               for (i= 0; i < sizeof(loopValues) / sizeof(*loopValues); i++)
+               {
+                       retval= inet_aton(loopValues[i].dq, &addr);
+                       if (retval == 0)
+                       {
+                               g_error("Error converting address '%s'", loopValues[i].dq);
+                       }
+                       *(uint32_t*) ((void*) rttKey + loopValues[i].offset)=
+                               addr.s_addr;
+               }
+
+               g_hash_table_insert(rttInfo, rttKey, rtt);
+
+               positionStream(rttStream);
+               retval= getline(&line, &len, rttStream);
+       }
+
+       if (line)
+       {
+               free(line);
+       }
+}
+
+
+/*
+ * Advance stream over empty space, empty lines and lines that begin with '#'
+ *
+ * Args:
+ *   stream:     stream, at exit, will be over the first non-empty character
+ *               of a line of be at EOF
+ */
+static void positionStream(FILE* stream)
+{
+       int firstChar;
+       ssize_t retval;
+       char* line= NULL;
+       size_t len;
+
+       do
+       {
+               firstChar= fgetc(stream);
+               if (firstChar == (int) '#')
+               {
+                       retval= getline(&line, &len, stream);
+                       if (retval == -1)
+                       {
+                               if (feof(stream))
+                               {
+                                       goto outEof;
+                               }
+                               else
+                               {
+                                       g_error(strerror(errno));
+                               }
+                       }
+               }
+               else if (firstChar == (int) '\n' || firstChar == (int) ' ' ||
+                       firstChar == (int) '\t')
+               {}
+               else if (firstChar == EOF)
+               {
+                       goto outEof;
+               }
+               else
+               {
+                       break;
+               }
+       } while (true);
+       retval= ungetc(firstChar, stream);
+       if (retval == EOF)
+       {
+               g_error("Error: ungetc()");
+       }
+
+outEof:
+       if (line)
+       {
+               free(line);
+       }
+}
index 7ecdb336fa8eea2b889e18f56a2a6eb378844aab..06e6cab301b78f6ff81df38ca3490a4edf4d1e2c 100644 (file)
@@ -37,9 +37,14 @@ typedef struct
        TracePairStats** allStats;
 } AnalysisStatsEval;
 
+struct RttKey
+{
+       uint32_t saddr, daddr;
+};
+
 typedef struct
 {
-       // double* rttInfo[saddr][daddr]
+       // double* rttInfo[RttKey]
        GHashTable* rttInfo;
 
        AnalysisStatsEval* stats;
index 10dc8d78de9af947d6fb2c06dd057f14a9b9e11e..cae9093681e90069e500dd071e39b0e2019409bb 100644 (file)
@@ -27,7 +27,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 
 #include "event_analysis_linreg.h"
 
index 9eb6e10861ef5ada8f5e6dcfd03a4a00c220230c..3db88e582251be8323ad830888ac08bdb98b71b0 100644 (file)
@@ -26,7 +26,7 @@
 #include <unistd.h>
 
 #include "event_analysis.h"
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 
 #include "event_matching_broadcast.h"
 
@@ -215,6 +215,11 @@ static void matchEventBroadcast(SyncState* const syncState, Event* const event)
                                g_queue_push_tail(broadcast->events, event);
                                if (broadcast->events->length == syncState->traceNb)
                                {
+                                       if (matchingData->stats)
+                                       {
+                                               matchingData->stats->totComplete++;
+                                       }
+
                                        g_hash_table_steal(matchingData->pendingBroadcasts, datagramKey);
                                        free(datagramKey);
                                        syncState->analysisModule->analyzeBroadcast(syncState, broadcast);
@@ -226,6 +231,12 @@ static void matchEventBroadcast(SyncState* const syncState, Event* const event)
                                broadcast= malloc(sizeof(Broadcast));
                                broadcast->events= g_queue_new();
                                g_queue_push_tail(broadcast->events, event);
+
+                               datagramKey= malloc(sizeof(DatagramKey));
+                               *datagramKey= *event->event.udpEvent->datagramKey;
+
+                               g_hash_table_insert(matchingData->pendingBroadcasts,
+                                       datagramKey, broadcast);
                        }
                }
                else
@@ -288,7 +299,6 @@ static void printMatchingStatsBroadcast(SyncState* const syncState)
        {
                return;
        }
-
        matchingData= (MatchingDataBroadcast*) syncState->matchingData;
 
        printf("Broadcast matching stats:\n");
index 6b8f538eaf25cddbd5809e70c5f062e4bfa12710..98a158277b137a805bf00bef3962bf26ed8612c0 100644 (file)
@@ -26,7 +26,7 @@
 #include <unistd.h>
 
 #include "event_analysis.h"
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 
 #include "event_matching_tcp.h"
 
index f251b055f05ae36495bd61967ffc3f4c101b39bc..26971b262a2a9e3e22311d69344d0d91b5d311ed 100644 (file)
@@ -22,7 +22,7 @@
 
 #include <stdlib.h>
 
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 #include "event_processing_lttng_common.h"
 
 #include "event_processing_lttng_null.h"
index 489dec5fd6e60481b377cf514a9ca4c3efd1aed2..1ee27c761567ddbee8e707b149cb00cc708208dd 100644 (file)
@@ -29,7 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 #include "event_processing_lttng_common.h"
 
 #include "event_processing_lttng_standard.h"
diff --git a/lttv/lttv/sync/sync_chain.h b/lttv/lttv/sync/sync_chain.h
new file mode 100644 (file)
index 0000000..fa39b96
--- /dev/null
@@ -0,0 +1,77 @@
+/* This file is part of the Linux Trace Toolkit viewer
+ * Copyright (C) 2009 Benjamin Poirier <benjamin.poirier@polymtl.ca>
+ *
+ * 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 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.
+ *
+ * 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.
+ */
+
+#ifndef SYNC_CHAIN_H
+#define SYNC_CHAIN_H
+
+#include <glib.h>
+#include <sys/time.h>
+
+#include "event_processing.h"
+#include "event_matching.h"
+#include "event_analysis.h"
+
+typedef struct _SyncState
+{
+       unsigned int traceNb;
+       bool stats;
+       const char* graphs;
+
+       const ProcessingModule* processingModule;
+       void* processingData;
+       const MatchingModule* matchingModule;
+       void* matchingData;
+       const AnalysisModule* analysisModule;
+       void* analysisData;
+} SyncState;
+
+typedef struct
+{
+       const char* longName;
+       enum {
+               NO_ARG,
+               REQUIRED_ARG,
+               //OPTIONAL_ARG,
+               HAS_ARG_COUNT // This must be the last field
+       } hasArg;
+       union
+       {
+               bool present;
+               const char* arg;
+       };
+       const char* optionHelp;
+       const char* argHelp;
+} ModuleOption;
+
+
+extern GQueue processingModules;
+extern GQueue matchingModules;
+extern GQueue analysisModules;
+extern GQueue moduleOptions;
+
+
+void syncTraceset(LttvTracesetContext* const traceSetContext);
+
+char* changeToGraphDir(const char* const graphs);
+void timeDiff(struct timeval* const end, const struct timeval* const start);
+
+gint gcfCompareProcessing(gconstpointer a, gconstpointer b);
+gint gcfCompareMatching(gconstpointer a, gconstpointer b);
+gint gcfCompareAnalysis(gconstpointer a, gconstpointer b);
+
+#endif
index 399b79628221c7446cf5f2637e01ccc2b3beff0f..9652f346328da0f6138f10bed0107ecbe1a82468 100644 (file)
@@ -33,7 +33,7 @@
 #include <lttv/module.h>
 #include <lttv/option.h>
 
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 
 
 #ifndef g_info
@@ -45,19 +45,51 @@ static void init();
 static void destroy();
 
 static void gfAppendAnalysisName(gpointer data, gpointer user_data);
-
-static gboolean optionSync;
-static gboolean optionSyncStats;
-static gboolean optionSyncNull;
-static char* optionSyncAnalysis;
-static gboolean optionSyncGraphs;
-static char* optionSyncGraphsDir;
-static char graphsDir[20];
+static void gfAddModuleOption(gpointer data, gpointer user_data);
+static void gfRemoveModuleOption(gpointer data, gpointer user_data);
 
 GQueue processingModules= G_QUEUE_INIT;
 GQueue matchingModules= G_QUEUE_INIT;
 GQueue analysisModules= G_QUEUE_INIT;
-
+GQueue moduleOptions= G_QUEUE_INIT;
+
+static char* argHelpNone= "none";
+static ModuleOption optionSync= {
+       .longName= "sync",
+       .hasArg= NO_ARG,
+       {.present= false},
+       .optionHelp= "synchronize the time between the traces",
+};
+static char graphsDir[20];
+static ModuleOption optionSyncStats= {
+       .longName= "sync-stats",
+       .hasArg= NO_ARG,
+       {.present= false},
+       .optionHelp= "print statistics about the time synchronization",
+};
+static ModuleOption optionSyncNull= {
+       .longName= "sync-null",
+       .hasArg= NO_ARG,
+       {.present= false},
+       .optionHelp= "read the events but do not perform any processing",
+};
+static GString* analysisModulesNames;
+static ModuleOption optionSyncAnalysis= {
+       .longName= "sync-analysis",
+       .hasArg= REQUIRED_ARG,
+       .optionHelp= "specify the algorithm to use for event analysis",
+};
+static ModuleOption optionSyncGraphs= {
+       .longName= "sync-graphs",
+       .hasArg= NO_ARG,
+       {.present= false},
+       .optionHelp= "output gnuplot graph showing synchronization points",
+};
+static ModuleOption optionSyncGraphsDir= {
+       .longName= "sync-graphs-dir",
+       .hasArg= REQUIRED_ARG,
+       .optionHelp= "specify the directory where to store the graphs",
+};
 
 /*
  * Module init function
@@ -72,51 +104,37 @@ GQueue analysisModules= G_QUEUE_INIT;
  */
 static void init()
 {
-       GString* analysisModulesNames;
        int retval;
 
        g_debug("\t\t\tXXXX sync init\n");
 
-       optionSync= FALSE;
-       lttv_option_add("sync", '\0', "synchronize the time between the traces" ,
-               "none", LTTV_OPT_NONE, &optionSync, NULL, NULL);
-
-       optionSyncStats= FALSE;
-       lttv_option_add("sync-stats", '\0', "print statistics about the time "
-               "synchronization", "none", LTTV_OPT_NONE, &optionSyncStats, NULL,
-               NULL);
-
-       optionSyncNull= FALSE;
-       lttv_option_add("sync-null", '\0', "read the events but do not perform "
-               "any processing", "none", LTTV_OPT_NONE, &optionSyncNull, NULL, NULL);
-
        g_assert(g_queue_get_length(&analysisModules) > 0);
-       optionSyncAnalysis= ((AnalysisModule*)
+       optionSyncAnalysis.arg = ((AnalysisModule*)
                g_queue_peek_head(&analysisModules))->name;
        analysisModulesNames= g_string_new("");
        g_queue_foreach(&analysisModules, &gfAppendAnalysisName,
                analysisModulesNames);
        // remove the last ", "
        g_string_truncate(analysisModulesNames, analysisModulesNames->len - 2);
-       lttv_option_add("sync-analysis", '\0', "specify the algorithm to use for "
-               "event analysis" , analysisModulesNames->str, LTTV_OPT_STRING,
-               &optionSyncAnalysis, NULL, NULL);
-       g_string_free(analysisModulesNames, TRUE);
-
-       optionSyncGraphs= FALSE;
-       lttv_option_add("sync-graphs", '\0', "output gnuplot graph showing "
-               "synchronization points", "none", LTTV_OPT_NONE, &optionSyncGraphs,
-               NULL, NULL);
+       optionSyncAnalysis.argHelp= analysisModulesNames->str;
 
        retval= snprintf(graphsDir, sizeof(graphsDir), "graphs-%d", getpid());
        if (retval > sizeof(graphsDir) - 1)
        {
                graphsDir[sizeof(graphsDir) - 1]= '\0';
        }
-       optionSyncGraphsDir= graphsDir;
-       lttv_option_add("sync-graphs-dir", '\0', "specify the directory where to"
-               " store the graphs", graphsDir, LTTV_OPT_STRING, &optionSyncGraphsDir,
-               NULL, NULL);
+       optionSyncGraphsDir.arg= graphsDir;
+       optionSyncGraphsDir.argHelp= graphsDir;
+
+       g_queue_push_head(&moduleOptions, &optionSyncGraphsDir);
+       g_queue_push_head(&moduleOptions, &optionSyncGraphs);
+       g_queue_push_head(&moduleOptions, &optionSyncAnalysis);
+       g_queue_push_head(&moduleOptions, &optionSyncNull);
+       g_queue_push_head(&moduleOptions, &optionSyncStats);
+       g_queue_push_head(&moduleOptions, &optionSync);
+
+       g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL);
+
 }
 
 
@@ -127,12 +145,13 @@ static void destroy()
 {
        g_debug("\t\t\tXXXX sync destroy\n");
 
-       lttv_option_remove("sync");
-       lttv_option_remove("sync-stats");
-       lttv_option_remove("sync-null");
-       lttv_option_remove("sync-analysis");
-       lttv_option_remove("sync-graphs");
-       lttv_option_remove("sync-graphs-dir");
+       g_queue_foreach(&moduleOptions, &gfRemoveModuleOption, NULL);
+       g_string_free(analysisModulesNames, TRUE);
+
+       g_queue_clear(&processingModules);
+       g_queue_clear(&matchingModules);
+       g_queue_clear(&analysisModules);
+       g_queue_clear(&moduleOptions);
 }
 
 
@@ -153,13 +172,13 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        FILE* graphsStream;
        int retval;
 
-       if (optionSync == FALSE)
+       if (!optionSync.present)
        {
                g_debug("Not synchronizing traceset because option is disabled");
                return;
        }
 
-       if (optionSyncStats)
+       if (optionSyncStats.present)
        {
                gettimeofday(&startTime, 0);
                getrusage(RUSAGE_SELF, &startUsage);
@@ -169,7 +188,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        syncState= malloc(sizeof(SyncState));
        syncState->traceNb= lttv_traceset_number(traceSetContext->ts);
 
-       if (optionSyncStats)
+       if (optionSyncStats.present)
        {
                syncState->stats= true;
        }
@@ -178,9 +197,9 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
                syncState->stats= false;
        }
 
-       if (optionSyncGraphs)
+       if (optionSyncGraphs.present)
        {
-               syncState->graphs= optionSyncGraphsDir;
+               syncState->graphs= optionSyncGraphsDir.arg;
        }
        else
        {
@@ -189,7 +208,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
 
        // Identify and initialize processing module
        syncState->processingData= NULL;
-       if (optionSyncNull)
+       if (optionSyncNull.present)
        {
                result= g_queue_find_custom(&processingModules, "LTTV-null",
                        &gcfCompareProcessing);
@@ -237,7 +256,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        g_assert(result != NULL);
        syncState->matchingModule= (MatchingModule*) result->data;
 
-       result= g_queue_find_custom(&analysisModules, optionSyncAnalysis,
+       result= g_queue_find_custom(&analysisModules, optionSyncAnalysis.arg,
                &gcfCompareAnalysis);
        if (result != NULL)
        {
@@ -245,7 +264,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        }
        else
        {
-               g_error("Analysis module '%s' not found", optionSyncAnalysis);
+               g_error("Analysis module '%s' not found", optionSyncAnalysis.arg);
        }
 
        syncState->processingModule->initProcessing(syncState, traceSetContext);
@@ -253,7 +272,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        syncState->matchingData= NULL;
        syncState->analysisData= NULL;
 
-       if (!optionSyncNull)
+       if (!optionSyncNull.present)
        {
                syncState->matchingModule->initMatching(syncState);
                syncState->analysisModule->initAnalysis(syncState);
@@ -342,7 +361,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
 
        free(syncState);
 
-       if (optionSyncStats)
+       if (optionSyncStats.present)
        {
                gettimeofday(&endTime, 0);
                retval= getrusage(RUSAGE_SELF, &endUsage);
@@ -478,7 +497,7 @@ static void gfAppendAnalysisName(gpointer data, gpointer user_data)
  *   The current working directory before the execution of the function. The
  *   string must be free'd by the caller.
  */
-char* changeToGraphDir(char* const graphs)
+char* changeToGraphDir(const char* const graphs)
 {
        int retval;
        char* cwd;
@@ -509,6 +528,43 @@ char* changeToGraphDir(char* const graphs)
 }
 
 
+/*
+ * A GFunc for g_queue_foreach()
+ *
+ * Args:
+ *   data:         ModuleOption*
+ *   user_data:    NULL
+ */
+static void gfAddModuleOption(gpointer data, gpointer user_data)
+{
+       ModuleOption* option;
+       LttvOptionType conversion[]= {
+               [NO_ARG]= LTTV_OPT_NONE,
+               [REQUIRED_ARG]= LTTV_OPT_STRING,
+       };
+
+       g_assert_cmpuint(sizeof(conversion) / sizeof(*conversion), ==,
+               HAS_ARG_COUNT);
+       option= (ModuleOption*) data;
+       lttv_option_add(option->longName, '\0', option->optionHelp,
+               option->argHelp ? option->argHelp : argHelpNone,
+               conversion[option->hasArg], &option->arg, NULL, NULL);
+}
+
+
+/*
+ * A GFunc for g_queue_foreach()
+ *
+ * Args:
+ *   data:         ModuleOption*
+ *   user_data:    NULL
+ */
+static void gfRemoveModuleOption(gpointer data, gpointer user_data)
+{
+       lttv_option_remove(((ModuleOption*) data)->longName);
+}
+
+
 LTTV_MODULE("sync", "Synchronize traces", \
        "Synchronizes a traceset based on the correspondance of network events", \
        init, destroy, "option")
diff --git a/lttv/lttv/sync/sync_chain_lttv.h b/lttv/lttv/sync/sync_chain_lttv.h
deleted file mode 100644 (file)
index 1f7a273..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* This file is part of the Linux Trace Toolkit viewer
- * Copyright (C) 2009 Benjamin Poirier <benjamin.poirier@polymtl.ca>
- *
- * 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 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.
- *
- * 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.
- */
-
-#ifndef SYNC_CHAIN_LTTV_H
-#define SYNC_CHAIN_LTTV_H
-
-#include <glib.h>
-#include <sys/time.h>
-
-#include "event_processing.h"
-#include "event_matching.h"
-#include "event_analysis.h"
-
-typedef struct _SyncState
-{
-       unsigned int traceNb;
-       bool stats;
-       char* graphs;
-
-       const ProcessingModule* processingModule;
-       void* processingData;
-       const MatchingModule* matchingModule;
-       void* matchingData;
-       const AnalysisModule* analysisModule;
-       void* analysisData;
-} SyncState;
-
-extern GQueue processingModules;
-extern GQueue matchingModules;
-extern GQueue analysisModules;
-
-
-void syncTraceset(LttvTracesetContext* const traceSetContext);
-
-char* changeToGraphDir(char* const graphs);
-void timeDiff(struct timeval* const end, const struct timeval* const start);
-
-gint gcfCompareProcessing(gconstpointer a, gconstpointer b);
-gint gcfCompareMatching(gconstpointer a, gconstpointer b);
-gint gcfCompareAnalysis(gconstpointer a, gconstpointer b);
-
-#endif
index a452d08db7e76e771949286b9db86fdb1d555f28..d35a59a23faa246d91952edbf0985b059c591fb0 100644 (file)
@@ -34,7 +34,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include "sync_chain_lttv.h"
+#include "sync_chain.h"
 
 
 #ifndef g_info
index 6514ef0a5ccd9e9203840e509f815da870f3f391..53681f48bb4dbb775b1509bd8307a15c982c2632 100644 (file)
@@ -39,7 +39,7 @@
 #include <lttv/iattribute.h>
 #include <lttv/stats.h>
 #include <lttv/filter.h>
-#include <lttv/sync/sync_chain_lttv.h>
+#include <lttv/sync/sync_chain.h>
 #include <lttvwindow/mainwindow.h>
 #include <lttvwindow/mainwindow-private.h>
 #include <lttvwindow/menu.h>
index 4b02f33250f886c17082ed4e18537355e7627b5f..3ee4d021fc6539c4f804b086fd2bac7596a8f99e 100644 (file)
@@ -34,7 +34,7 @@
 #include <lttv/stats.h>
 #include <lttv/filter.h>
 #include <ltt/trace.h>
-#include <lttv/sync/sync_chain_lttv.h>
+#include <lttv/sync/sync_chain.h>
 
 static LttvTraceset *traceset;
 
index 86f3c657b27680cc977cafff86078c5a217dc477..731720c840d24414fd9ea8c325b07492f84476e9 100644 (file)
@@ -41,7 +41,7 @@
 #include <lttv/module.h>
 #include <lttv/option.h>
 #include <lttv/print.h>
-#include <lttv/sync/sync_chain_lttv.h>
+#include <lttv/sync/sync_chain.h>
 #include <ltt/ltt.h>
 #include <ltt/event.h>
 #include <ltt/trace.h>
This page took 0.038502 seconds and 4 git commands to generate.