Make modules more flexible (builtin or loaded are identical). Add a test module
[lttv.git] / ltt / branches / poly / lttv / main / stats.c
index 0c68d37715d9f5304b1252b5da4a5ef94b505e4d..c577ab77bb2112df29c52c41ae5502edeff20a30 100644 (file)
@@ -18,7 +18,9 @@
 
 
 #include <stdio.h>
+#include <lttv/module.h>
 #include <lttv/stats.h>
+#include <lttv/lttv.h>
 #include <ltt/facility.h>
 #include <ltt/trace.h>
 #include <ltt/event.h>
@@ -52,7 +54,7 @@ find_event_tree(LttvTracefileStats *tfcs, GQuark process, GQuark cpu,
 static void
 init(LttvTracesetStats *self, LttvTraceset *ts)
 {
-  guint i, j, nb_trace, nb_control, nb_per_cpu, nb_tracefile;
+  guint i, j, nb_trace, nb_tracefile;
 
   LttvTraceContext *tc;
 
@@ -74,17 +76,11 @@ init(LttvTracesetStats *self, LttvTraceset *ts)
     tcs = (LttvTraceStats *)tc = (LTTV_TRACESET_CONTEXT(self)->traces[i]);
     tcs->stats = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
 
-    nb_control = ltt_trace_control_tracefile_number(tc->t);
-    nb_per_cpu = ltt_trace_per_cpu_tracefile_number(tc->t);
-    nb_tracefile = nb_control + nb_per_cpu;
-    for(j = 0 ; j < nb_tracefile ; j++) {
-      if(j < nb_control) {
-        tfcs = LTTV_TRACEFILE_STATS(tc->control_tracefiles[j]);
-      }
-      else {
-        tfcs = LTTV_TRACEFILE_STATS(tc->per_cpu_tracefiles[j - nb_control]);
-      }
+    nb_tracefile = ltt_trace_control_tracefile_number(tc->t) +
+        ltt_trace_per_cpu_tracefile_number(tc->t);
 
+    for(j = 0 ; j < nb_tracefile ; j++) {
+      tfcs = LTTV_TRACEFILE_STATS(tc->tracefiles[j]);
       tfcs->stats = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL);
       find_event_tree(tfcs, LTTV_STATS_PROCESS_UNKNOWN,
           tfcs->parent.cpu_name, LTTV_STATE_MODE_UNKNOWN, 
@@ -120,17 +116,11 @@ fini(LttvTracesetStats *self)
     tcs = (LttvTraceStats *)tc = (LTTV_TRACESET_CONTEXT(self)->traces[i]);
     lttv_attribute_recursive_free(tcs->stats);
 
-    nb_tracefile = ltt_trace_control_tracefile_number(tc->t);
-    for(j = 0 ; j < nb_tracefile ; j++) {
-      tfcs = (LttvTracefileStats *)tfc = tc->control_tracefiles[j];
-      lttv_attribute_recursive_free(tfcs->stats);
-      tfcs->current_events_tree = NULL;
-      tfcs->current_event_types_tree = NULL;
-    }
+    nb_tracefile = ltt_trace_control_tracefile_number(tc->t) +
+        ltt_trace_per_cpu_tracefile_number(tc->t);
 
-    nb_tracefile = ltt_trace_per_cpu_tracefile_number(tc->t);
     for(j = 0 ; j < nb_tracefile ; j++) {
-      tfcs = (LttvTracefileStats *)tfc = tc->per_cpu_tracefiles[j];
+      tfcs = (LttvTracefileStats *)tfc = tc->tracefiles[j];
       lttv_attribute_recursive_free(tfcs->stats);
       tfcs->current_events_tree = NULL;
       tfcs->current_event_types_tree = NULL;
@@ -202,7 +192,7 @@ lttv_traceset_stats_get_type(void)
       (GClassInitFunc) traceset_stats_class_init,   /* class_init */
       NULL,   /* class_finalize */
       NULL,   /* class_data */
-      sizeof (LttvTracesetContext),
+      sizeof (LttvTracesetStats),
       0,      /* n_preallocs */
       (GInstanceInitFunc) traceset_stats_instance_init    /* instance_init */
     };
@@ -478,7 +468,7 @@ gboolean before_schedchange(void *hook_data, void *call_data)
 
   /* get the information for the process scheduled in */
 
-  process = lttv_state_find_process(&(tfcs->parent), pid_in);
+  process = lttv_state_find_process_or_create(&(tfcs->parent), pid_in);
 
   find_event_tree(tfcs, process->pid_time, tfcs->parent.cpu_name, 
       process->state->t, process->state->n, &(tfcs->current_events_tree), 
@@ -630,7 +620,7 @@ lttv_stats_add_event_hooks(LttvTracesetStats *self)
 {
   LttvTraceset *traceset = self->parent.parent.ts;
 
-  guint i, j, k, nb_trace, nb_control, nb_per_cpu, nb_tracefile;
+  guint i, j, k, nb_trace, nb_tracefile;
 
   LttFacility *f;
 
@@ -719,18 +709,11 @@ lttv_stats_add_event_hooks(LttvTracesetStats *self)
 
     /* Add these hooks to each before_event_by_id hooks list */
 
-    nb_control = ltt_trace_control_tracefile_number(ts->parent.parent.t);
-    nb_per_cpu = ltt_trace_per_cpu_tracefile_number(ts->parent.parent.t);
-    nb_tracefile = nb_control + nb_per_cpu;
-    for(j = 0 ; j < nb_tracefile ; j++) {
-      if(j < nb_control) {
-        tfs = LTTV_TRACEFILE_STATS(ts->parent.parent.control_tracefiles[j]);
-      }
-      else {
-        tfs = LTTV_TRACEFILE_STATS(ts->parent.parent.per_cpu_tracefiles[
-            j-nb_control]);
-      }
+    nb_tracefile = ltt_trace_control_tracefile_number(ts->parent.parent.t) +
+        ltt_trace_per_cpu_tracefile_number(ts->parent.parent.t);
 
+    for(j = 0 ; j < nb_tracefile ; j++) {
+      tfs = LTTV_TRACEFILE_STATS(ts->parent.parent.tracefiles[j]);
       lttv_hooks_add(tfs->parent.parent.after_event, every_event, NULL);
 
       for(k = 0 ; k < before_hooks->len ; k++) {
@@ -761,7 +744,7 @@ lttv_stats_remove_event_hooks(LttvTracesetStats *self)
 {
   LttvTraceset *traceset = self->parent.parent.ts;
 
-  guint i, j, k, nb_trace, nb_control, nb_per_cpu, nb_tracefile;
+  guint i, j, k, nb_trace, nb_tracefile;
 
   LttvTraceStats *ts;
 
@@ -787,18 +770,11 @@ lttv_stats_remove_event_hooks(LttvTracesetStats *self)
 
     /* Add these hooks to each before_event_by_id hooks list */
 
-    nb_control = ltt_trace_control_tracefile_number(ts->parent.parent.t);
-    nb_per_cpu = ltt_trace_per_cpu_tracefile_number(ts->parent.parent.t);
-    nb_tracefile = nb_control + nb_per_cpu;
-    for(j = 0 ; j < nb_tracefile ; j++) {
-      if(j < nb_control) {
-        tfs = LTTV_TRACEFILE_STATS(ts->parent.parent.control_tracefiles[j]);
-      }
-      else {
-        tfs =LTTV_TRACEFILE_STATS(ts->parent.parent.per_cpu_tracefiles[
-            j-nb_control]);
-      }
+    nb_tracefile = ltt_trace_control_tracefile_number(ts->parent.parent.t) +
+        ltt_trace_per_cpu_tracefile_number(ts->parent.parent.t);
 
+    for(j = 0 ; j < nb_tracefile ; j++) {
+      tfs = LTTV_TRACEFILE_STATS(ts->parent.parent.tracefiles[j]);
       lttv_hooks_remove_data(tfs->parent.parent.after_event, every_event, 
           NULL);
 
@@ -815,7 +791,7 @@ lttv_stats_remove_event_hooks(LttvTracesetStats *self)
            hook.id), hook.h, &g_array_index(after_hooks, LttvTraceHook, k));
       }
     }
-    g_critical("lttv_stats_remove_event_hooks()");
+    g_debug("lttv_stats_remove_event_hooks()");
     g_array_free(before_hooks, TRUE);
     g_array_free(after_hooks, TRUE);
   }
@@ -823,27 +799,6 @@ lttv_stats_remove_event_hooks(LttvTracesetStats *self)
 }
 
 
-void lttv_stats_init(int argc, char **argv)
-{
-  LTTV_STATS_PROCESS_UNKNOWN = g_quark_from_string("unknown process");
-  LTTV_STATS_PROCESSES = g_quark_from_string("processes");
-  LTTV_STATS_CPU = g_quark_from_string("cpu");
-  LTTV_STATS_MODE_TYPES = g_quark_from_string("mode_types");
-  LTTV_STATS_MODES = g_quark_from_string("modes");
-  LTTV_STATS_SUBMODES = g_quark_from_string("submodes");
-  LTTV_STATS_EVENT_TYPES = g_quark_from_string("event_types");
-  LTTV_STATS_CPU_TIME = g_quark_from_string("cpu time");
-  LTTV_STATS_ELAPSED_TIME = g_quark_from_string("elapsed time");
-  LTTV_STATS_EVENTS = g_quark_from_string("events");
-  LTTV_STATS_EVENTS_COUNT = g_quark_from_string("events count");
-  LTTV_STATS_BEFORE_HOOKS = g_quark_from_string("saved stats before hooks");
-  LTTV_STATS_AFTER_HOOKS = g_quark_from_string("saved stats after hooks");
-}
-
-void lttv_stats_destroy() 
-{
-}
-
 void lttv_stats_save_attribute(LttvAttribute *attr, char *indent, FILE * fp)
 {
   LttvAttributeType type;
@@ -1149,7 +1104,7 @@ gboolean lttv_stats_load_statistics(LttvTracesetStats *self)
   char filename[BUF_SIZE];
 
   GMarkupParseContext * context;
-  GError * error;
+  GError * error = NULL;
   GMarkupParser markup_parser =
     {
       stats_parser_start_element,
@@ -1196,3 +1151,30 @@ gboolean lttv_stats_load_statistics(LttvTracesetStats *self)
 
   return TRUE;
 }
+
+
+static void module_init()
+{
+  LTTV_STATS_PROCESS_UNKNOWN = g_quark_from_string("unknown process");
+  LTTV_STATS_PROCESSES = g_quark_from_string("processes");
+  LTTV_STATS_CPU = g_quark_from_string("cpu");
+  LTTV_STATS_MODE_TYPES = g_quark_from_string("mode_types");
+  LTTV_STATS_MODES = g_quark_from_string("modes");
+  LTTV_STATS_SUBMODES = g_quark_from_string("submodes");
+  LTTV_STATS_EVENT_TYPES = g_quark_from_string("event_types");
+  LTTV_STATS_CPU_TIME = g_quark_from_string("cpu time");
+  LTTV_STATS_ELAPSED_TIME = g_quark_from_string("elapsed time");
+  LTTV_STATS_EVENTS = g_quark_from_string("events");
+  LTTV_STATS_EVENTS_COUNT = g_quark_from_string("events count");
+  LTTV_STATS_BEFORE_HOOKS = g_quark_from_string("saved stats before hooks");
+  LTTV_STATS_AFTER_HOOKS = g_quark_from_string("saved stats after hooks");
+}
+
+static void module_destroy() 
+{
+}
+
+
+LTTV_MODULE("stats", "Compute processes statistics", \
+    "Accumulate statistics for event types, processes and CPUs", \
+    module_init, module_destroy, "state");
This page took 0.025298 seconds and 4 git commands to generate.