Do not use __attribute__((constructor))
[lttv.git] / lttv / lttv / sync / sync_chain_lttv.c
index 5dd10bf9fb827deaa5ea6ea1777a2cee4a955b82..7fd0c6e435666300fa646cdddf90b692af97629e 100644 (file)
 #include <lttv/module.h>
 #include <lttv/option.h>
 
+
+#include "event_processing_lttng_standard.h"
+#include "event_processing_lttng_null.h"
+#include "event_matching_tcp.h"
+#include "event_matching_broadcast.h"
+#include "event_matching_distributor.h"
+#include "event_analysis_chull.h"
+#include "event_analysis_linreg.h"
+#include "event_analysis_eval.h"
 #include "sync_chain.h"
 #include "sync_chain_lttv.h"
 
 static void init();
 static void destroy();
 
-static void gfAppendAnalysisName(gpointer data, gpointer user_data);
 static void gfAddModuleOption(gpointer data, gpointer user_data);
 static void gfRemoveModuleOption(gpointer data, gpointer user_data);
 
-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;
@@ -73,25 +76,20 @@ static ModuleOption optionSyncAnalysis= {
 static ModuleOption optionSyncGraphs= {
        .longName= "sync-graphs",
        .hasArg= NO_ARG,
-       {.present= false},
        .optionHelp= "output gnuplot graph showing synchronization points",
 };
+static char graphsDir[20];
 static ModuleOption optionSyncGraphsDir= {
        .longName= "sync-graphs-dir",
        .hasArg= REQUIRED_ARG,
        .optionHelp= "specify the directory where to store the graphs",
 };
 
+
 /*
  * Module init function
  *
- * This function is declared to be the module initialization function. Event
- * modules are registered with a "constructor (102)" attribute except one in
- * each class (processing, matching, analysis) which is chosen to be the
- * default and which is registered with a "constructor (101)" attribute.
- * Constructors with no priority are called after constructors with
- * priorities. The result is that the list of event modules is known when this
- * function is executed.
+ * This function is declared to be the module initialization function.
  */
 static void init()
 {
@@ -99,8 +97,26 @@ static void init()
 
        g_debug("Sync init");
 
+       /*
+        * Initialize event modules
+        * Call the "constructor" or initialization function of each event module
+        * so it can register itself. This must be done before elements in
+        * processingModules, matchingModules, analysisModules or moduleOptions
+        * are accessed.
+        */
+       registerProcessingLTTVStandard();
+       registerProcessingLTTVNull();
+
+       registerMatchingTCP();
+       registerMatchingBroadcast();
+       registerMatchingDistributor();
+
+       registerAnalysisCHull();
+       registerAnalysisLinReg();
+       registerAnalysisEval();
+
        g_assert(g_queue_get_length(&analysisModules) > 0);
-       optionSyncAnalysis.arg = ((AnalysisModule*)
+       optionSyncAnalysis.arg= ((AnalysisModule*)
                g_queue_peek_head(&analysisModules))->name;
        analysisModulesNames= g_string_new("");
        g_queue_foreach(&analysisModules, &gfAppendAnalysisName,
@@ -125,7 +141,6 @@ static void init()
        g_queue_push_head(&moduleOptions, &optionSync);
 
        g_queue_foreach(&moduleOptions, &gfAddModuleOption, NULL);
-
 }
 
 
@@ -153,8 +168,11 @@ static void destroy()
  *
  * Args:
  *   traceSetContext: traceset
+ *
+ * Returns:
+ *   false if synchronization was not performed, true otherwise
  */
-void syncTraceset(LttvTracesetContext* const traceSetContext)
+bool syncTraceset(LttvTracesetContext* const traceSetContext)
 {
        SyncState* syncState;
        struct timeval startTime, endTime;
@@ -166,7 +184,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        if (!optionSync.present)
        {
                g_debug("Not synchronizing traceset because option is disabled");
-               return;
+               return false;
        }
 
        if (optionSyncStats.present)
@@ -177,7 +195,6 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
 
        // Initialize data structures
        syncState= malloc(sizeof(SyncState));
-       syncState->traceNb= lttv_traceset_number(traceSetContext->ts);
 
        if (optionSyncStats.present)
        {
@@ -188,7 +205,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
                syncState->stats= false;
        }
 
-       if (optionSyncGraphs.present)
+       if (!optionSyncNull.present && optionSyncGraphs.present)
        {
                // Create the graph directory right away in case the module initialization
                // functions have something to write in it.
@@ -233,12 +250,12 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
                g_error("Analysis module '%s' not found", optionSyncAnalysis.arg);
        }
 
+       syncState->processingModule->initProcessing(syncState, traceSetContext);
        if (!optionSyncNull.present)
        {
-               syncState->analysisModule->initAnalysis(syncState);
                syncState->matchingModule->initMatching(syncState);
+               syncState->analysisModule->initAnalysis(syncState);
        }
-       syncState->processingModule->initProcessing(syncState, traceSetContext);
 
        // Process traceset
        lttv_process_traceset_seek_time(traceSetContext, ltt_time_zero);
@@ -249,7 +266,7 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
        syncState->processingModule->finalizeProcessing(syncState);
 
        // Write graphs file
-       if (optionSyncGraphs.present)
+       if (!optionSyncNull.present && optionSyncGraphs.present)
        {
                writeGraphsScript(syncState);
 
@@ -259,21 +276,10 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
                }
        }
 
-       if (syncState->processingModule->printProcessingStats != NULL)
+       if (!optionSyncNull.present && optionSyncStats.present)
        {
-               syncState->processingModule->printProcessingStats(syncState);
-       }
-       if (syncState->matchingModule->printMatchingStats != NULL)
-       {
-               syncState->matchingModule->printMatchingStats(syncState);
-       }
-       if (syncState->analysisModule->printAnalysisStats != NULL)
-       {
-               syncState->analysisModule->printAnalysisStats(syncState);
-       }
+               printStats(syncState);
 
-       if (optionSyncStats.present)
-       {
                printf("Resulting synchronization factors:\n");
                for (i= 0; i < syncState->traceNb; i++)
                {
@@ -317,22 +323,8 @@ void syncTraceset(LttvTracesetContext* const traceSetContext)
                printf("\tsystem time: %ld.%06ld\n", endUsage.ru_stime.tv_sec,
                        endUsage.ru_stime.tv_usec);
        }
-}
 
-
-/*
- * A GFunc for g_queue_foreach()
- *
- * Concatenate analysis module names.
- *
- * Args:
- *   data:         AnalysisModule*
- *   user_data:    GString*, concatenated names
- */
-static void gfAppendAnalysisName(gpointer data, gpointer user_data)
-{
-       g_string_append((GString*) user_data, ((AnalysisModule*) data)->name);
-       g_string_append((GString*) user_data, ", ");
+       return true;
 }
 
 
@@ -345,18 +337,33 @@ static void gfAppendAnalysisName(gpointer data, gpointer user_data)
  */
 static void gfAddModuleOption(gpointer data, gpointer user_data)
 {
-       ModuleOption* option;
+       ModuleOption* option= data;
        LttvOptionType conversion[]= {
                [NO_ARG]= LTTV_OPT_NONE,
+               [OPTIONAL_ARG]= LTTV_OPT_NONE,
                [REQUIRED_ARG]= LTTV_OPT_STRING,
        };
+       size_t fieldOffset[]= {
+               [NO_ARG]= offsetof(ModuleOption, present),
+               [REQUIRED_ARG]= offsetof(ModuleOption, arg),
+       };
+       static const char* argHelpNone= "none";
 
        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);
+       if (option->hasArg == OPTIONAL_ARG)
+       {
+               g_warning("Parameters with optional arguments not supported by the "
+                       "lttv option scheme, parameter '%s' will not be available",
+                       option->longName);
+       }
+       else
+       {
+               lttv_option_add(option->longName, '\0', option->optionHelp,
+                       option->argHelp ? option->argHelp : argHelpNone,
+                       conversion[option->hasArg], (void*) option + fieldOffset[option->hasArg],
+                       NULL, NULL);
+       }
 }
 
 
This page took 0.027773 seconds and 4 git commands to generate.