+/* This file is part of the Linux Trace Toolkit viewer
+ * Copyright (C) 2003-2004 Michel Dagenais
+ *
+ * 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.
+ */
+
#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>
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;
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,
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;
(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 */
};
/* 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),
{
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;
/* 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++) {
{
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;
/* 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);
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);
}
}
-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;
char filename[BUF_SIZE];
GMarkupParseContext * context;
- GError * error;
+ GError * error = NULL;
GMarkupParser markup_parser =
{
stats_parser_start_element,
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");