Traverse a path recursively to add all traces within
[lttv.git] / lttv / modules / text / batchAnalysis.c
index e150f4d18db9c473dc113c45e1f50dfd17529eda..cfd2bab72bd4fbb994f60258e8f9caed3779bd39 100644 (file)
 #endif
 
 #include <glib.h>
+#include <unistd.h>
 #include <lttv/lttv.h>
 #include <lttv/attribute.h>
 #include <lttv/hook.h>
 #include <lttv/option.h>
 #include <lttv/module.h>
-#include <lttv/tracecontext.h>
+#include <lttv/traceset-process.h>
 #include <lttv/state.h>
+#ifdef BABEL_CLEANUP
 #include <lttv/stats.h>
 #include <lttv/filter.h>
+#endif
 #include <ltt/trace.h>
+#ifdef BABEL_CLEANUP_SYNC
 #include <lttv/sync/sync_chain_lttv.h>
+#endif
+#include <babeltrace/context.h>
 
 static LttvTraceset *traceset;
 
@@ -48,17 +54,32 @@ static LttvHooks
   *event_hook,
   *main_hooks;
 
-static char *a_trace;
+static char *trace_path;
 
 static gboolean a_stats;
+static gboolean a_live;
+static int a_live_update_period;
+
+#define DEFAULT_LIVE_UPDATE_PERIOD 1
 
 void lttv_trace_option(void *hook_data)
 { 
-  LttTrace *trace;
-
-  trace = ltt_trace_open(a_trace);
+  //LttTrace *trace;
+  //trace_collection *trace;  
+  //format *fmt = bt_lookup_format(g_quark_from_static_string("ctf"));
+  /*
+  if(a_live) {
+    //trace = ltt_trace_open_live(a_trace);
+  } else {
+    bt_create_context();
+    //trace = bt_add_trace(a_trace,"ctf");
+  }
   if(trace == NULL) g_critical("cannot open trace %s", a_trace);
-  lttv_traceset_add(traceset, lttv_trace_new(trace));
+  lttv_traceset_add(traceset, lttv_trace_new(trace));*/
+
+  if(lttv_traceset_add_path(traceset, trace_path) < 0) {
+    g_error("Cannot add trace %s", trace_path);
+  }
 }
 
 
@@ -68,17 +89,18 @@ static gboolean process_traceset(void *hook_data, void *call_data)
 
   LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
 
-  LttvTracesetStats *tscs;
+#ifdef BABEL_CLEANUP
+  LttvTracesetStats *tscs = NULL;
 
   LttvTracesetState *tss;
 
   LttvTracesetContext *tc;
-
+#endif
   LttTime start, end;
   gboolean retval;
 
   g_info("BatchAnalysis begin process traceset");
-
+#ifdef BABEL_CLEANUP
   if (a_stats) {
     tscs = g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
     tss = &tscs->parent;
@@ -91,12 +113,13 @@ static gboolean process_traceset(void *hook_data, void *call_data)
 
   lttv_context_init(tc, traceset);
 
-  /* Disabled by Mathieu, does not build on x86_64 */
-  /* syncTraceset(tc); */
 
-  lttv_state_add_event_hooks(tc);
+  syncTraceset(tc);
+
+  lttv_state_add_event_hooks(tss);
   if(a_stats) lttv_stats_add_event_hooks(tscs);
 
+
   retval= lttv_iattribute_find_by_path(attributes, "filter/expression",
     LTTV_POINTER, &value_expression);
   g_assert(retval);
@@ -116,16 +139,16 @@ static gboolean process_traceset(void *hook_data, void *call_data)
   //g_debug("Filter string: %s",((GString*)*(value_expression.v_pointer))->str);
 
   lttv_filter_append_expression(*(value_filter.v_pointer),((GString*)*(value_expression.v_pointer))->str);
-  
+#endif  
   //lttv_traceset_context_add_hooks(tc,
   //before_traceset, after_traceset, NULL, before_trace, after_trace,
   //NULL, before_tracefile, after_tracefile, NULL, before_event, after_event);
-  lttv_process_traceset_begin(tc,
+
+  lttv_state_add_event_hooks(traceset);
+  lttv_process_traceset_begin(traceset,
                               before_traceset,
                               before_trace,
-                              before_tracefile,
-                              event_hook,
-                              NULL);
+                              event_hook);
 
   start.tv_sec = 0;
   start.tv_nsec = 0;
@@ -133,35 +156,50 @@ static gboolean process_traceset(void *hook_data, void *call_data)
   end.tv_nsec = G_MAXULONG;
 
   g_info("BatchAnalysis process traceset");
-
-  lttv_process_traceset_seek_time(tc, start);
-  lttv_process_traceset_middle(tc,
-                               end,
-                               G_MAXULONG,
-                               NULL);
+  lttv_process_traceset_seek_time(traceset, start);
+  /* Read as long a we do not reach the end (0) */
+  unsigned int count;
+  unsigned int updated_count;
+  do {
+         count = lttv_process_traceset_middle(traceset,
+                                                         end,
+                                                         G_MAXULONG,
+                                                         NULL);
+         
+#ifdef BABEL_CLEANUP
+         updated_count = lttv_process_traceset_update(tc);
+#endif
+               
+         sleep(a_live_update_period);
+  } while(count != 0
+#ifdef BABEL_CLEANUP
+      || updated_count > 0
+#endif
+      );
 
 
   //lttv_traceset_context_remove_hooks(tc,
   //before_traceset, after_traceset, NULL, before_trace, after_trace,
   //NULL, before_tracefile, after_tracefile, NULL, before_event, after_event);
-  lttv_process_traceset_end(tc,
+  lttv_process_traceset_end(traceset,
                             after_traceset,
                             after_trace,
-                            after_tracefile,
-                            event_hook,
-                            NULL);
+                            event_hook);
 
   g_info("BatchAnalysis destroy context");
-
+#ifdef BABEL_CLEANUP
   lttv_filter_destroy(*(value_filter.v_pointer));
+
   lttv_state_remove_event_hooks(tss);
   if(a_stats) lttv_stats_remove_event_hooks(tscs);
+
   lttv_context_fini(tc);
   if (a_stats)
     g_object_unref(tscs);
   else
     g_object_unref(tss);
-
+#endif
   g_info("BatchAnalysis end process traceset");
   return FALSE;
 }
@@ -179,7 +217,7 @@ static void init()
   lttv_option_add("trace", 't', 
       "add a trace to the trace set to analyse", 
       "pathname of the directory containing the trace", 
-      LTTV_OPT_STRING, &a_trace, lttv_trace_option, NULL);
+      LTTV_OPT_STRING, &trace_path, lttv_trace_option, NULL);
 
   a_stats = FALSE;
   lttv_option_add("stats", 's', 
@@ -187,6 +225,20 @@ static void init()
       "", 
       LTTV_OPT_NONE, &a_stats, NULL, NULL);
 
+  a_live = FALSE;
+  lttv_option_add("live", 0,
+      "define if the traceset is receiving live informations",
+      "",
+      LTTV_OPT_NONE, &a_live, NULL, NULL);
+  
+  a_live_update_period = DEFAULT_LIVE_UPDATE_PERIOD;
+  lttv_option_add("live-period", 0,
+                 "period to update a live trace",
+                 "in seconds",
+                 LTTV_OPT_INT,
+                 &a_live_update_period,
+                 NULL, NULL);
+
 
   traceset = lttv_traceset_new();
 
@@ -244,14 +296,18 @@ static void init()
 
 static void destroy()
 {
+#ifdef BABEL_CLEANUP
   guint i, nb;
 
   LttvTrace *trace;
+#endif
 
   g_info("Destroy batchAnalysis.c");
 
   lttv_option_remove("trace");
   lttv_option_remove("stats");
+  lttv_option_remove("live");
+  lttv_option_remove("live-period");
 
   lttv_hooks_destroy(before_traceset);
   lttv_hooks_destroy(after_traceset);
@@ -264,18 +320,18 @@ static void destroy()
   lttv_hooks_destroy(event_hook);
   lttv_hooks_remove_data(main_hooks, process_traceset, NULL);
 
+#ifdef BABEL_CLEANUP
   nb = lttv_traceset_number(traceset);
   for(i = 0 ; i < nb ; i++) {
     trace = lttv_traceset_get(traceset, i);
     ltt_trace_close(lttv_trace(trace));
-    /* This will be done by lttv_traceset_destroy */
-    //lttv_trace_destroy(trace);
+    lttv_trace_destroy(trace);
   }
-
+#endif
   lttv_traceset_destroy(traceset); 
 }
 
 LTTV_MODULE("batchAnalysis", "Batch processing of a trace", \
     "Run through a trace calling all the registered hooks", \
-    /* init, destroy, "state", "stats", "option","textFilter", "sync") */
-    init, destroy, "state", "stats", "option","textFilter")
+    init, destroy, "state", "option")
+//TODO ybrosseau 2012-05-15 reenable textFilter, stats, sync
This page took 0.025546 seconds and 4 git commands to generate.