Update FSF address
[lttv.git] / lttv / lttv / stats.h
CommitLineData
9c312311 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Michel Dagenais
3 *
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;
7 *
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.
12 *
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
b9ce0bad
YB
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16 * MA 02110-1301, USA.
9c312311 17 */
18
b445142a 19#ifndef STATS_H
20#define STATS_H
21
7a4bdb54
YB
22#error "stats not supported."
23
b445142a 24#include <glib.h>
25#include <lttv/state.h>
dc877563 26
27/* The statistics are for a complete time interval. These structures differ
28 from the system state since they relate to static components of the
29 system (all processes which existed instead of just the currently
30 existing processes).
31
b445142a 32 The basic attributes tree to gather for several different execution modes
33 (e.g., user mode, syscall, irq), thereafter called the "events tree",
34 contains the following attributes: the number of events of each type,
35 the total number of events, the number of bytes written, the time spent
36 executing, waiting for a resource, waiting for a cpu, and possibly many
37 others. The name "facility-event_type" below is to be replaced
38 by specific event types (e.g., core-schedchange, code-syscall_entry...).
39
40 event_types/
41 "facility-event_type"
42 events_count
43 cpu_time
b49e54b4 44 cumulative_cpu_time
b445142a 45 elapsed_time
46 wait_time
47 bytes_written
48 packets_sent
49 ...
50
51 The events for several different execution modes are joined together to
52 form the "execution modes tree". The name "execution mode" is to be replaced
53 by "system call", "trap", "irq", "user mode" or "kernel thread".
54 The name "submode" is to be replaced by the specific system call, trap or
55 irq name. The "submode" is an empty string if none is applicable, which is
56 the case for "user mode" and "kernel thread".
57
58 An "events tree" for each "execution mode" contains the sum for all its
59 different submodes. An "events tree" in the "execution modes tree" contains
60 the sum for all its different execution modes.
61
62 mode_types/
63 "execution mode"/
64 submodes/
65 "submode"/
66 Events Tree
67 events/
68 Event Tree
69 events/
70 Events Tree
71
72 Each trace set contains an "execution modes tree". While the traces
73 come from possibly different systems, which may differ in their system
74 calls..., most of the system calls will have the same name, even if their
75 actual internal numeric id differs. Categories such as cpu id and process
76 id are not kept since these are specific to each system. When several
77 traces are taken from the same system, these categories may make sense and
78 could eventually be considered.
79
80 Each trace contains a global "execution modes tree", one for each
81 cpu and process, and one for each process/cpu combination. The name
82 "cpu number" stands for the cpu identifier, and "process_id-start_time"
83 is a unique process identifier composed of the process id
84 (unique at any given time but which may be reused over time) concatenated
302efbad 85 with the process start time. Each process has a "functions" tree which
86 contains each process'function address (when the information is available).
87 If not, only the 0x0 function will appear.
b445142a 88
89 modes/
90 Execution Modes Tree
91 cpu/
92 "cpu number"/
93 Execution Modes Tree
94 processes/
95 "process_id-start_time"/
96 exec_file_name
97 parent
98 start_time
99 end_time
100 modes/
101 Execution Modes Tree
102 cpu/
103 "cpu number"/
104 Execution Modes Tree
302efbad 105 functions/
106 "function address"/
107 Execution Modes Tree
108 functions/
109 "function address"/
110 Execution Modes Tree
b445142a 111
112 All the events and derived values (cpu, elapsed and wait time) are
113 added during the trace analysis in the relevant
302efbad 114 trace/processes/ * /cpu/ * /functions/ * /mode_types/ * /submodes/ *
b445142a 115 "events tree". To achieve this efficiently, each tracefile context
116 contains a pointer to the current relevant "events tree" and "event_types"
117 tree within it.
118
119 Once all the events are processed, the total number of events is computed
302efbad 120 within each
121 trace/processes/ * /cpu/ * /functions/ * /mode_types/ * /submodes/ *.
b445142a 122 Then, the "events tree" are summed for all submodes within each mode type
302efbad 123 and for all mode types within a processes/ * /cpu/ * /functions/ *
b445142a 124 "execution modes tree".
302efbad 125
126 Then, the "execution modes trees" for all functions within a
127 trace/processes/ * /cpu for all cpu within a process, for all processes,
128 and for all traces are computed. Separately, the "execution modes tree" for
129 each function (over all cpus) for all processes, and for all traces are
130 summed in the trace/processes/ * /functions/ * subtree.
131
b445142a 132 Finally, the "execution modes trees" for all cpu within a process,
133 for all processes, and for all traces are computed. Separately,
134 the "execution modes tree" for each cpu but for all processes within a
135 trace are summed in the trace / cpu / * subtrees.
136
137 */
138
139
140/* The various statistics branch names are GQuarks. They are pre-computed for
141 easy and efficient access */
142
359b2948 143#define LTTV_PRIO_STATS_BEFORE_STATE LTTV_PRIO_STATE-5
144#define LTTV_PRIO_STATS_AFTER_STATE LTTV_PRIO_STATE+5
145
146
b445142a 147extern GQuark
90e19f82
AM
148 LTTV_STATS_PROCESS_UNKNOWN,
149 LTTV_STATS_PROCESSES,
150 LTTV_STATS_CPU,
151 LTTV_STATS_MODE_TYPES,
152 LTTV_STATS_SUBMODES,
153 LTTV_STATS_FUNCTIONS,
154 LTTV_STATS_EVENT_TYPES,
155 LTTV_STATS_CPU_TIME,
156 LTTV_STATS_CUMULATIVE_CPU_TIME,
157 LTTV_STATS_ELAPSED_TIME,
158 LTTV_STATS_EVENTS,
159 LTTV_STATS_EVENTS_COUNT,
160 LTTV_STATS_BEFORE_HOOKS,
161 LTTV_STATS_AFTER_HOOKS;
b445142a 162
163
164typedef struct _LttvTracesetStats LttvTracesetStats;
165typedef struct _LttvTracesetStatsClass LttvTracesetStatsClass;
166
167typedef struct _LttvTraceStats LttvTraceStats;
168typedef struct _LttvTraceStatsClass LttvTraceStatsClass;
169
170typedef struct _LttvTracefileStats LttvTracefileStats;
171typedef struct _LttvTracefileStatsClass LttvTracefileStatsClass;
172
516a8712 173typedef struct _LttvCPUStats LttvCPUStats;
d3e01c7a 174
175// Hook wrapper. call_data is a trace context.
00e74b69 176gboolean lttv_stats_hook_add_event_hooks(void *hook_data, void *call_data);
177void lttv_stats_add_event_hooks(LttvTracesetStats *self);
b445142a 178
d3e01c7a 179// Hook wrapper. call_data is a trace context.
00e74b69 180gboolean lttv_stats_hook_remove_event_hooks(void *hook_data, void *call_data);
181void lttv_stats_remove_event_hooks(LttvTracesetStats *self);
b445142a 182
d3e01c7a 183gboolean lttv_stats_sum_traceset_hook(void *hook_data, void *call_data);
b91e751b 184void lttv_stats_sum_traceset(LttvTracesetStats *self, LttTime current_time);
9f797243 185
b91e751b 186void lttv_stats_sum_trace(LttvTraceStats *self, LttvAttribute *ts_stats,
90e19f82 187 LttTime current_time);
9f797243 188
d730b5c8 189/* Reset all statistics containers */
190void lttv_stats_reset(LttvTracesetStats *self);
191
b445142a 192
193/* The LttvTracesetStats, LttvTraceStats and LttvTracefileStats types
194 inherit from the corresponding State objects defined in state.h.. */
195
196#define LTTV_TRACESET_STATS_TYPE (lttv_traceset_stats_get_type ())
197#define LTTV_TRACESET_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACESET_STATS_TYPE, LttvTracesetStats))
198#define LTTV_TRACESET_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACESET_STATS_TYPE, LttvTracesetStatsClass))
199#define LTTV_IS_TRACESET_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACESET_STATS_TYPE))
200#define LTTV_IS_TRACESET_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACESET_STATS_TYPE))
201#define LTTV_TRACESET_STATS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACESET_STATS_TYPE, LttvTracesetStatsClass))
202
203struct _LttvTracesetStats {
90e19f82 204 LttvTracesetState parent;
b445142a 205
90e19f82 206 LttvAttribute *stats;
b445142a 207};
208
209struct _LttvTracesetStatsClass {
90e19f82 210 LttvTracesetStateClass parent;
b445142a 211};
212
213GType lttv_traceset_stats_get_type (void);
214
516a8712
MD
215struct _LttvCPUStats {
216 LttvAttribute *current_events_tree;
217 LttvAttribute *current_event_types_tree;
218 LttvTraceStats *tcs;
219 guint cpu;
220};
b445142a 221
222#define LTTV_TRACE_STATS_TYPE (lttv_trace_stats_get_type ())
223#define LTTV_TRACE_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACE_STATS_TYPE, LttvTraceStats))
224#define LTTV_TRACE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACE_STATS_TYPE, LttvTraceStatsClass))
225#define LTTV_IS_TRACE_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACE_STATS_TYPE))
226#define LTTV_IS_TRACE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACE_STATS_TYPE))
227#define LTTV_TRACE_STATS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACE_STATS_TYPE, LttvTraceStatsClass))
228
229struct _LttvTraceStats {
90e19f82 230 LttvTraceState parent;
b445142a 231
90e19f82 232 LttvAttribute *stats;
516a8712 233 LttvCPUStats *cpu_stats; /* Array indexed by CPU */
b445142a 234};
235
236struct _LttvTraceStatsClass {
90e19f82 237 LttvTraceStateClass parent;
b445142a 238};
239
240GType lttv_trace_stats_get_type (void);
241
242
243#define LTTV_TRACEFILE_STATS_TYPE (lttv_tracefile_stats_get_type ())
244#define LTTV_TRACEFILE_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACEFILE_STATS_TYPE, LttvTracefileStats))
245#define LTTV_TRACEFILE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACEFILE_STATS_TYPE, LttvTracefileStatsClass))
246#define LTTV_IS_TRACEFILE_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACEFILE_STATS_TYPE))
247#define LTTV_IS_TRACEFILE_STATS_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACEFILE_STATS_TYPE))
248#define LTTV_TRACEFILE_STATS_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACEFILE_STATS_TYPE, LttvTracefileStatsClass))
249
250struct _LttvTracefileStats {
90e19f82 251 LttvTracefileState parent;
b445142a 252
516a8712 253 LttvCPUStats *cpu_stats; /* "weak" reference */
b445142a 254};
255
256struct _LttvTracefileStatsClass {
90e19f82 257 LttvTracefileStateClass parent;
b445142a 258};
259
260GType lttv_tracefile_stats_get_type (void);
261
b91e751b 262struct sum_traceset_closure {
90e19f82
AM
263 LttvTracesetStats *tss;
264 LttTime current_time;
b91e751b 265};
266
dc877563 267
b445142a 268#endif // STATS_H
This page took 0.080428 seconds and 4 git commands to generate.