X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Finclude%2Flttv%2Fstate.h;h=8131bb8b1944da5c03a13dd378ad77d1721f20f3;hb=dd025f915d9b3a3e587578e97b3738115193c180;hp=bf9fa1ae4b2d532f97240b5d1766508350274fd7;hpb=3e5610273f292ff00d78f85020483d6a1abbfc02;p=lttv.git diff --git a/ltt/branches/poly/include/lttv/state.h b/ltt/branches/poly/include/lttv/state.h index bf9fa1ae..8131bb8b 100644 --- a/ltt/branches/poly/include/lttv/state.h +++ b/ltt/branches/poly/include/lttv/state.h @@ -1,10 +1,28 @@ +/* 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. + */ + #ifndef STATE_H #define STATE_H #include #include -/* The operating system state kept during the trace analysis +/* The operating system state, kept during the trace analysis, contains a subset of the real operating system state, sufficient for the analysis, and possibly organized quite differently. @@ -12,23 +30,22 @@ and LttvTracefileContext objects, used by processTrace, through subtyping. The context objects already reflect the multiple tracefiles (one per cpu) per trace and multiple traces per trace set. The state - objects defined here simply add fields to the relevant context objects. */ + objects defined here simply add fields to the relevant context objects. + There is no traceset specific state yet. It may eventually contains such + things as clock differences over time. -/* The LttvProcessState structure defines the current state for each process. - A process can make system calls (in some rare cases nested) and receive - interrupts/faults. For instance, a process may issue a system call, - generate a page fault while reading an argument from user space, and - get caught by an interrupt. To represent these nested states, an - interrupt stack is maintained. The stack bottom is normal user mode and - the top of stack is the current interrupt state. + The trace state currently consists in a process table. - The interrupt state tells about the process status, interrupt type and - interrupt number. All these could be defined as enumerations but may - need extensions (e.g. new process state). GQuark are thus used being - as easy to manipulate as integers but having a string associated, just - like enumerations. */ + The tracefile level state relates to the associated cpu. It contains the + position of the current event in the tracefile (since the state depends on + which events have been processed) and a pointer to the current process, + in the process table, being run on that cpu. + For each process in the process table, various informations such as exec + file name, pid, ppid and creation time are stored. Each process state also + contains an execution mode stack (e.g. irq within system call, called + from user mode). */ typedef struct _LttvTracesetState LttvTracesetState; typedef struct _LttvTracesetStateClass LttvTracesetStateClass; @@ -39,31 +56,54 @@ typedef struct _LttvTraceStateClass LttvTraceStateClass; typedef struct _LttvTracefileState LttvTracefileState; typedef struct _LttvTracefileStateClass LttvTracefileStateClass; -gboolean lttv_state_add_event_hooks(LttvTracesetState *self); +void lttv_state_add_event_hooks(LttvTracesetState *self); -gboolean lttv_state_remove_event_hooks(LttvTracesetState *self); +void lttv_state_remove_event_hooks(LttvTracesetState *self); +void lttv_state_save_add_event_hooks(LttvTracesetState *self); -/* The interrupt type is one of "user mode", "kernel thread", "system call", +void lttv_state_save_remove_event_hooks(LttvTracesetState *self); + +void lttv_state_traceset_seek_time_closest(LttvTracesetState *self, LttTime t); + +/* The LttvProcessState structure defines the current state for each process. + A process can make system calls (in some rare cases nested) and receive + interrupts/faults. For instance, a process may issue a system call, + generate a page fault while reading an argument from user space, and + get caught by an interrupt. To represent these nested states, an + execution mode stack is maintained. The stack bottom is normal user mode + and the top of stack is the current execution mode. + + The execution mode stack tells about the process status, execution mode and + submode (interrupt, system call or IRQ number). All these could be + defined as enumerations but may need extensions (e.g. new process state). + GQuark are thus used. They are as easy to manipulate as integers but have + a string associated, just like enumerations. + + The execution mode is one of "user mode", "kernel thread", "system call", "interrupt request", "fault". */ -typedef GQuark LttvInterruptType; +typedef GQuark LttvExecutionMode; -extern LttvInterruptType +extern LttvExecutionMode LTTV_STATE_USER_MODE, LTTV_STATE_SYSCALL, LTTV_STATE_TRAP, - LTTV_STATE_IRQ; + LTTV_STATE_IRQ, + LTTV_STATE_MODE_UNKNOWN; -/* The interrupt number depends on the interrupt type. For user mode or kernel - thread, which are the normal mode (interrupt stack bottom), it is set to - "none". For interrupt requests, faults and system calls, it is set - respectively to the interrupt name (e.g. "timer"), fault name +/* The submode number depends on the execution mode. For user mode or kernel + thread, which are the normal mode (execution mode stack bottom), + it is set to "none". For interrupt requests, faults and system calls, + it is set respectively to the interrupt name (e.g. "timer"), fault name (e.g. "page fault"), and system call name (e.g. "select"). */ -typedef GQuark LttvInterruptNumber; +typedef GQuark LttvExecutionSubmode; +extern LttvExecutionSubmode + LTTV_STATE_SUBMODE_NONE, + LTTV_STATE_SUBMODE_UNKNOWN; /* The process status is one of "running", "wait-cpu" (runnable), or "wait-*" where "*" describes the resource waited for (e.g. timer, process, @@ -80,26 +120,30 @@ extern LttvProcessStatus LTTV_STATE_RUN; -typedef struct _LttvInterruptState { - LttvInterruptType t; - LttvInterruptNumber n; +typedef struct _LttvExecutionState { + LttvExecutionMode t; + LttvExecutionSubmode n; LttTime entry; - LttTime last_change; + LttTime change; LttvProcessStatus s; -} LttvInterruptState; +} LttvExecutionState; typedef struct _LttvProcessState { guint pid; guint ppid; - LttTime birth; + LttTime creation_time; GQuark name; - GArray *interrupt_stack; /* Array of LttvInterruptState */ - LttvInterruptState *state; /* Top of interrupt stack */ - /* opened file descriptors, address map... */ + GQuark pid_time; + GArray *execution_stack; /* Array of LttvExecutionState */ + LttvExecutionState *state; /* Top of interrupt stack */ + /* opened file descriptors, address map?... */ } LttvProcessState; +LttvProcessState *lttv_state_find_process(LttvTracefileState *tfs, guint pid); + + /* The LttvTracesetState, LttvTraceState and LttvTracefileState types inherit from the corresponding Context objects defined in processTrace. */ @@ -132,15 +176,33 @@ struct _LttvTraceState { LttvTraceContext parent; GHashTable *processes; /* LttvProcessState objects indexed by pid */ + guint nb_event, save_interval; /* Block/char devices, locks, memory pages... */ + GQuark *eventtype_names; + GQuark *syscall_names; + GQuark *trap_names; + GQuark *irq_names; + gboolean recompute_state_in_seek; + gboolean saved_state_available; }; struct _LttvTraceStateClass { LttvTraceContextClass parent; + + void (*state_save) (LttvTraceState *self, LttvAttribute *container); + void (*state_restore) (LttvTraceState *self, LttvAttribute *container); + void (*state_saved_free) (LttvTraceState *self, LttvAttribute *container); }; GType lttv_trace_state_get_type (void); +void lttv_state_save(LttvTraceState *self, LttvAttribute *container); + +void lttv_state_restore(LttvTraceState *self, LttvAttribute *container); + +void lttv_state_saved_state_free(LttvTraceState *self, + LttvAttribute *container); + #define LTTV_TRACEFILE_STATE_TYPE (lttv_tracefile_state_get_type ()) #define LTTV_TRACEFILE_STATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LTTV_TRACEFILE_STATE_TYPE, LttvTracefileState)) @@ -153,6 +215,8 @@ struct _LttvTracefileState { LttvTracefileContext parent; LttvProcessState *process; + GQuark cpu_name; + guint saved_position; }; struct _LttvTracefileStateClass { @@ -162,4 +226,4 @@ struct _LttvTracefileStateClass { GType lttv_tracefile_state_get_type (void); -#endif // PROCESSTRACE_H +#endif // STATE_H