Draw_Item .h and .c design complete. Now, needs to be implemented.
[lttv.git] / ltt / branches / poly / include / lttv / state.h
... / ...
CommitLineData
1#ifndef STATE_H
2#define STATE_H
3
4#include <glib.h>
5#include <lttv/processTrace.h>
6
7/* The operating system state kept during the trace analysis
8 contains a subset of the real operating system state,
9 sufficient for the analysis, and possibly organized quite differently.
10
11 The state information is added to LttvTracesetContext, LttvTraceContext
12 and LttvTracefileContext objects, used by processTrace, through
13 subtyping. The context objects already reflect the multiple tracefiles
14 (one per cpu) per trace and multiple traces per trace set. The state
15 objects defined here simply add fields to the relevant context objects. */
16
17typedef struct _LttvTracesetState LttvTracesetState;
18typedef struct _LttvTracesetStateClass LttvTracesetStateClass;
19
20typedef struct _LttvTraceState LttvTraceState;
21typedef struct _LttvTraceStateClass LttvTraceStateClass;
22
23typedef struct _LttvTracefileState LttvTracefileState;
24typedef struct _LttvTracefileStateClass LttvTracefileStateClass;
25
26gboolean lttv_state_add_event_hooks(LttvTracesetState *self);
27
28gboolean lttv_state_remove_event_hooks(LttvTracesetState *self);
29
30/* The LttvProcessState structure defines the current state for each process.
31 A process can make system calls (in some rare cases nested) and receive
32 interrupts/faults. For instance, a process may issue a system call,
33 generate a page fault while reading an argument from user space, and
34 get caught by an interrupt. To represent these nested states, an
35 execution mode stack is maintained. The stack bottom is normal user mode
36 and the top of stack is the current execution mode.
37
38 The execution mode stack tells about the process status, execution mode and
39 submode (interrupt, system call or IRQ number). All these could be
40 defined as enumerations but may need extensions (e.g. new process state).
41 GQuark are thus used. They are as easy to manipulate as integers but have
42 a string associated, just like enumerations.
43
44 The execution mode is one of "user mode", "kernel thread", "system call",
45 "interrupt request", "fault". */
46
47typedef GQuark LttvExecutionMode;
48
49extern LttvExecutionMode
50 LTTV_STATE_USER_MODE,
51 LTTV_STATE_SYSCALL,
52 LTTV_STATE_TRAP,
53 LTTV_STATE_IRQ,
54 LTTV_STATE_MODE_UNKNOWN;
55
56
57/* The submode number depends on the execution mode. For user mode or kernel
58 thread, which are the normal mode (execution mode stack bottom),
59 it is set to "none". For interrupt requests, faults and system calls,
60 it is set respectively to the interrupt name (e.g. "timer"), fault name
61 (e.g. "page fault"), and system call name (e.g. "select"). */
62
63typedef GQuark LttvExecutionSubmode;
64
65extern LttvExecutionSubmode
66 LTTV_STATE_SUBMODE_NONE,
67 LTTV_STATE_SUBMODE_UNKNOWN;
68
69/* The process status is one of "running", "wait-cpu" (runnable), or "wait-*"
70 where "*" describes the resource waited for (e.g. timer, process,
71 disk...). */
72
73typedef GQuark LttvProcessStatus;
74
75extern LttvProcessStatus
76 LTTV_STATE_UNNAMED,
77 LTTV_STATE_WAIT_FORK,
78 LTTV_STATE_WAIT_CPU,
79 LTTV_STATE_EXIT,
80 LTTV_STATE_WAIT,
81 LTTV_STATE_RUN;
82
83
84typedef struct _LttvExecutionState {
85 LttvExecutionMode t;
86 LttvExecutionSubmode n;
87 LttTime entry;
88 LttTime change;
89 LttvProcessStatus s;
90} LttvExecutionState;
91
92
93typedef struct _LttvProcessState {
94 guint pid;
95 guint ppid;
96 LttTime creation_time;
97 GQuark name;
98 GQuark pid_time;
99 GArray *execution_stack; /* Array of LttvExecutionState */
100 LttvExecutionState *state; /* Top of interrupt stack */
101 /* opened file descriptors, address map?... */
102} LttvProcessState;
103
104
105LttvProcessState *lttv_state_find_process(LttvTracefileState *tfs, guint pid);
106
107
108/* The LttvTracesetState, LttvTraceState and LttvTracefileState types
109 inherit from the corresponding Context objects defined in processTrace. */
110
111#define LTTV_TRACESET_STATE_TYPE (lttv_traceset_state_get_type ())
112#define LTTV_TRACESET_STATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACESET_STATE_TYPE, LttvTracesetState))
113#define LTTV_TRACESET_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACESET_STATE_TYPE, LttvTracesetStateClass))
114#define LTTV_IS_TRACESET_STATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACESET_STATE_TYPE))
115#define LTTV_IS_TRACESET_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACESET_STATE_TYPE))
116#define LTTV_TRACESET_STATE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACESET_STATE_TYPE, LttvTracesetStateClass))
117
118struct _LttvTracesetState {
119 LttvTracesetContext parent;
120};
121
122struct _LttvTracesetStateClass {
123 LttvTracesetContextClass parent;
124};
125
126GType lttv_traceset_state_get_type (void);
127
128
129#define LTTV_TRACE_STATE_TYPE (lttv_trace_state_get_type ())
130#define LTTV_TRACE_STATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACE_STATE_TYPE, LttvTraceState))
131#define LTTV_TRACE_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACE_STATE_TYPE, LttvTraceStateClass))
132#define LTTV_IS_TRACE_STATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACE_STATE_TYPE))
133#define LTTV_IS_TRACE_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACE_STATE_TYPE))
134#define LTTV_TRACE_STATE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACE_STATE_TYPE, LttvTraceStateClass))
135
136struct _LttvTraceState {
137 LttvTraceContext parent;
138
139 GHashTable *processes; /* LttvProcessState objects indexed by pid */
140 /* Block/char devices, locks, memory pages... */
141 GQuark *eventtype_names;
142 GQuark *syscall_names;
143 GQuark *trap_names;
144 GQuark *irq_names;
145};
146
147struct _LttvTraceStateClass {
148 LttvTraceContextClass parent;
149};
150
151GType lttv_trace_state_get_type (void);
152
153
154#define LTTV_TRACEFILE_STATE_TYPE (lttv_tracefile_state_get_type ())
155#define LTTV_TRACEFILE_STATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACEFILE_STATE_TYPE, LttvTracefileState))
156#define LTTV_TRACEFILE_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), LTTV_TRACEFILE_STATE_TYPE, LttvTracefileStateClass))
157#define LTTV_IS_TRACEFILE_STATE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LTTV_TRACEFILE_STATE_TYPE))
158#define LTTV_IS_TRACEFILE_STATE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), LTTV_TRACEFILE_STATE_TYPE))
159#define LTTV_TRACEFILE_STATE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), LTTV_TRACEFILE_STATE_TYPE, LttvTracefileStateClass))
160
161struct _LttvTracefileState {
162 LttvTracefileContext parent;
163
164 LttvProcessState *process;
165 GQuark cpu_name;
166};
167
168struct _LttvTracefileStateClass {
169 LttvTracefileContextClass parent;
170};
171
172GType lttv_tracefile_state_get_type (void);
173
174
175#endif // STATE_H
This page took 0.02225 seconds and 4 git commands to generate.