1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Michel Dagenais
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23 #include <lttv/state.h>
25 /* The statistics are for a complete time interval. These structures differ
26 from the system state since they relate to static components of the
27 system (all processes which existed instead of just the currently
30 The basic attributes tree to gather for several different execution modes
31 (e.g., user mode, syscall, irq), thereafter called the "events tree",
32 contains the following attributes: the number of events of each type,
33 the total number of events, the number of bytes written, the time spent
34 executing, waiting for a resource, waiting for a cpu, and possibly many
35 others. The name "facility-event_type" below is to be replaced
36 by specific event types (e.g., core-schedchange, code-syscall_entry...).
48 The events for several different execution modes are joined together to
49 form the "execution modes tree". The name "execution mode" is to be replaced
50 by "system call", "trap", "irq", "user mode" or "kernel thread".
51 The name "submode" is to be replaced by the specific system call, trap or
52 irq name. The "submode" is an empty string if none is applicable, which is
53 the case for "user mode" and "kernel thread".
55 An "events tree" for each "execution mode" contains the sum for all its
56 different submodes. An "events tree" in the "execution modes tree" contains
57 the sum for all its different execution modes.
69 Each trace set contains an "execution modes tree". While the traces
70 come from possibly different systems, which may differ in their system
71 calls..., most of the system calls will have the same name, even if their
72 actual internal numeric id differs. Categories such as cpu id and process
73 id are not kept since these are specific to each system. When several
74 traces are taken from the same system, these categories may make sense and
75 could eventually be considered.
77 Each trace contains a global "execution modes tree", one for each
78 cpu and process, and one for each process/cpu combination. The name
79 "cpu number" stands for the cpu identifier, and "process_id-start_time"
80 is a unique process identifier composed of the process id
81 (unique at any given time but which may be reused over time) concatenated
82 with the process start time.
90 "process_id-start_time"/
101 All the events and derived values (cpu, elapsed and wait time) are
102 added during the trace analysis in the relevant
103 trace / processes / * / cpu / * / mode_types / * /submodes / *
104 "events tree". To achieve this efficiently, each tracefile context
105 contains a pointer to the current relevant "events tree" and "event_types"
108 Once all the events are processed, the total number of events is computed
109 within each trace / processes / * / cpu / * / mode_types / * / submodes / *.
110 Then, the "events tree" are summed for all submodes within each mode type
111 and for all mode types within a processes / * / cpu / *
112 "execution modes tree".
114 Finally, the "execution modes trees" for all cpu within a process,
115 for all processes, and for all traces are computed. Separately,
116 the "execution modes tree" for each cpu but for all processes within a
117 trace are summed in the trace / cpu / * subtrees.
122 /* The various statistics branch names are GQuarks. They are pre-computed for
123 easy and efficient access */
126 LTTV_STATS_PROCESS_UNKNOWN
,
127 LTTV_STATS_PROCESSES
,
129 LTTV_STATS_MODE_TYPES
,
131 LTTV_STATS_EVENT_TYPES
,
133 LTTV_STATS_ELAPSED_TIME
,
135 LTTV_STATS_EVENTS_COUNT
,
136 LTTV_STATS_BEFORE_HOOKS
,
137 LTTV_STATS_AFTER_HOOKS
;
140 typedef struct _LttvTracesetStats LttvTracesetStats
;
141 typedef struct _LttvTracesetStatsClass LttvTracesetStatsClass
;
143 typedef struct _LttvTraceStats LttvTraceStats
;
144 typedef struct _LttvTraceStatsClass LttvTraceStatsClass
;
146 typedef struct _LttvTracefileStats LttvTracefileStats
;
147 typedef struct _LttvTracefileStatsClass LttvTracefileStatsClass
;
149 gboolean
lttv_stats_add_event_hooks(LttvTracesetStats
*self
);
151 gboolean
lttv_stats_remove_event_hooks(LttvTracesetStats
*self
);
153 void lttv_stats_save_statistics(LttvTracesetStats
*self
);
155 gboolean
lttv_stats_load_statistics(LttvTracesetStats
*self
);
158 /* The LttvTracesetStats, LttvTraceStats and LttvTracefileStats types
159 inherit from the corresponding State objects defined in state.h.. */
161 #define LTTV_TRACESET_STATS_TYPE (lttv_traceset_stats_get_type ())
162 #define LTTV_TRACESET_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACESET_STATS_TYPE, LttvTracesetStats))
163 #define LTTV_TRACESET_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACESET_STATS_TYPE, LttvTracesetStatsClass))
164 #define LTTV_IS_TRACESET_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACESET_STATS_TYPE))
165 #define LTTV_IS_TRACESET_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACESET_STATS_TYPE))
166 #define LTTV_TRACESET_STATS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACESET_STATS_TYPE, LttvTracesetStatsClass))
168 struct _LttvTracesetStats
{
169 LttvTracesetState parent
;
171 LttvAttribute
*stats
;
174 struct _LttvTracesetStatsClass
{
175 LttvTracesetStateClass parent
;
178 GType
lttv_traceset_stats_get_type (void);
181 #define LTTV_TRACE_STATS_TYPE (lttv_trace_stats_get_type ())
182 #define LTTV_TRACE_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACE_STATS_TYPE, LttvTraceStats))
183 #define LTTV_TRACE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACE_STATS_TYPE, LttvTraceStatsClass))
184 #define LTTV_IS_TRACE_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACE_STATS_TYPE))
185 #define LTTV_IS_TRACE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACE_STATS_TYPE))
186 #define LTTV_TRACE_STATS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACE_STATS_TYPE, LttvTraceStatsClass))
188 struct _LttvTraceStats
{
189 LttvTraceState parent
;
191 LttvAttribute
*stats
;
194 struct _LttvTraceStatsClass
{
195 LttvTraceStateClass parent
;
198 GType
lttv_trace_stats_get_type (void);
201 #define LTTV_TRACEFILE_STATS_TYPE (lttv_tracefile_stats_get_type ())
202 #define LTTV_TRACEFILE_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACEFILE_STATS_TYPE, LttvTracefileStats))
203 #define LTTV_TRACEFILE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACEFILE_STATS_TYPE, LttvTracefileStatsClass))
204 #define LTTV_IS_TRACEFILE_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACEFILE_STATS_TYPE))
205 #define LTTV_IS_TRACEFILE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACEFILE_STATS_TYPE))
206 #define LTTV_TRACEFILE_STATS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACEFILE_STATS_TYPE, LttvTracefileStatsClass))
208 struct _LttvTracefileStats
{
209 LttvTracefileState parent
;
211 LttvAttribute
*stats
;
212 LttvAttribute
*current_events_tree
;
213 LttvAttribute
*current_event_types_tree
;
216 struct _LttvTracefileStatsClass
{
217 LttvTracefileStateClass parent
;
220 GType
lttv_tracefile_stats_get_type (void);