projects
/
lttv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
exec fix
[lttv.git]
/
ltt
/
branches
/
poly
/
lttv
/
lttv
/
state.c
diff --git
a/ltt/branches/poly/lttv/lttv/state.c
b/ltt/branches/poly/lttv/lttv/state.c
index 405f3d0214ccb9b590eadd0db98b5cd175da1dba..857fc9314dba201478f18d8690f1b303d552d739 100644
(file)
--- a/
ltt/branches/poly/lttv/lttv/state.c
+++ b/
ltt/branches/poly/lttv/lttv/state.c
@@
-47,9
+47,8
@@
GQuark
LTT_FACILITY_KERNEL,
LTT_FACILITY_KERNEL_ARCH,
GQuark
LTT_FACILITY_KERNEL,
LTT_FACILITY_KERNEL_ARCH,
- LTT_FACILITY_
PROCESS
,
+ LTT_FACILITY_
LIST
,
LTT_FACILITY_FS,
LTT_FACILITY_FS,
- LTT_FACILITY_STATEDUMP,
LTT_FACILITY_USER_GENERIC;
/* Events Quarks */
LTT_FACILITY_USER_GENERIC;
/* Events Quarks */
@@
-63,13
+62,13
@@
GQuark
LTT_EVENT_IRQ_EXIT,
LTT_EVENT_SOFT_IRQ_ENTRY,
LTT_EVENT_SOFT_IRQ_EXIT,
LTT_EVENT_IRQ_EXIT,
LTT_EVENT_SOFT_IRQ_ENTRY,
LTT_EVENT_SOFT_IRQ_EXIT,
- LTT_EVENT_SCHED
CHANG
E,
- LTT_EVENT_FORK,
- LTT_EVENT_K
ERNEL_THREAD
,
- LTT_EVENT_EXIT,
- LTT_EVENT_FREE,
+ LTT_EVENT_SCHED
_SCHEDUL
E,
+ LTT_EVENT_
PROCESS_
FORK,
+ LTT_EVENT_K
THREAD_CREATE
,
+ LTT_EVENT_
PROCESS_
EXIT,
+ LTT_EVENT_
PROCESS_
FREE,
LTT_EVENT_EXEC,
LTT_EVENT_EXEC,
- LTT_EVENT_
ENUM_
PROCESS_STATE,
+ LTT_EVENT_PROCESS_STATE,
LTT_EVENT_STATEDUMP_END,
LTT_EVENT_FUNCTION_ENTRY,
LTT_EVENT_FUNCTION_EXIT,
LTT_EVENT_STATEDUMP_END,
LTT_EVENT_FUNCTION_ENTRY,
LTT_EVENT_FUNCTION_EXIT,
@@
-82,13
+81,14
@@
GQuark
LTT_FIELD_TRAP_ID,
LTT_FIELD_IRQ_ID,
LTT_FIELD_SOFT_IRQ_ID,
LTT_FIELD_TRAP_ID,
LTT_FIELD_IRQ_ID,
LTT_FIELD_SOFT_IRQ_ID,
- LTT_FIELD_
OUT
,
- LTT_FIELD_
IN
,
- LTT_FIELD_
OUT
_STATE,
+ LTT_FIELD_
PREV_PID
,
+ LTT_FIELD_
NEXT_PID
,
+ LTT_FIELD_
PREV
_STATE,
LTT_FIELD_PARENT_PID,
LTT_FIELD_CHILD_PID,
LTT_FIELD_PID,
LTT_FIELD_TGID,
LTT_FIELD_PARENT_PID,
LTT_FIELD_CHILD_PID,
LTT_FIELD_PID,
LTT_FIELD_TGID,
+ LTT_FIELD_CHILD_TGID,
LTT_FIELD_FILENAME,
LTT_FIELD_NAME,
LTT_FIELD_TYPE,
LTT_FIELD_FILENAME,
LTT_FIELD_NAME,
LTT_FIELD_TYPE,
@@
-1436,7
+1436,7
@@
create_name_tables(LttvTraceState *tcs)
name_tables->nb_syscalls = 0;
}
name_tables->nb_syscalls = 0;
}
- if(!lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL,
+ if(!lttv_trace_find_hook(tcs->parent.t, LTT_FACILITY_KERNEL
_ARCH
,
LTT_EVENT_TRAP_ENTRY,
LTT_FIELD_TRAP_ID, 0, 0,
NULL, NULL, &h)) {
LTT_EVENT_TRAP_ENTRY,
LTT_FIELD_TRAP_ID, 0, 0,
NULL, NULL, &h)) {
@@
-2124,11
+2124,11
@@
static gboolean schedchange(void *hook_data, void *call_data)
LttEvent *e = ltt_tracefile_get_event(s->parent.tf);
LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data;
guint pid_in, pid_out;
LttEvent *e = ltt_tracefile_get_event(s->parent.tf);
LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data;
guint pid_in, pid_out;
- gint state_out;
+ gint
64
state_out;
pid_out = ltt_event_get_unsigned(e, thf->f1);
pid_in = ltt_event_get_unsigned(e, thf->f2);
pid_out = ltt_event_get_unsigned(e, thf->f1);
pid_in = ltt_event_get_unsigned(e, thf->f2);
- state_out = ltt_event_get_int(e, thf->f3);
+ state_out = ltt_event_get_
long_
int(e, thf->f3);
if(likely(process != NULL)) {
if(likely(process != NULL)) {
@@
-2153,6
+2153,7
@@
static gboolean schedchange(void *hook_data, void *call_data)
process->state->t = LTTV_STATE_SYSCALL;
process->state->s = LTTV_STATE_WAIT;
process->state->change = s->parent.timestamp;
process->state->t = LTTV_STATE_SYSCALL;
process->state->s = LTTV_STATE_WAIT;
process->state->change = s->parent.timestamp;
+ process->state->entry = s->parent.timestamp;
}
} else {
if(unlikely(process->state->s == LTTV_STATE_EXIT)) {
}
} else {
if(unlikely(process->state->s == LTTV_STATE_EXIT)) {
@@
-2164,8
+2165,8
@@
static gboolean schedchange(void *hook_data, void *call_data)
process->state->change = s->parent.timestamp;
}
process->state->change = s->parent.timestamp;
}
- if(state_out == 32)
- exit_process(s, process); /* EXIT_DEAD */
+ if(state_out == 32
|| state_out == 128
)
+ exit_process(s, process); /* EXIT_DEAD
|| TASK_DEAD
*/
/* see sched.h for states */
}
}
/* see sched.h for states */
}
}
@@
-2256,7
+2257,8
@@
static gboolean process_fork(void *hook_data, void *call_data)
return FALSE;
}
return FALSE;
}
-/* We stamp a newly created process as kernel_thread */
+/* We stamp a newly created process as kernel_thread.
+ * The thread should not be running yet. */
static gboolean process_kernel_thread(void *hook_data, void *call_data)
{
LttvTracefileState *s = (LttvTracefileState *)call_data;
static gboolean process_kernel_thread(void *hook_data, void *call_data)
{
LttvTracefileState *s = (LttvTracefileState *)call_data;
@@
-2273,7
+2275,10
@@
static gboolean process_kernel_thread(void *hook_data, void *call_data)
s->parent.target_pid = pid;
process = lttv_state_find_process(ts, ANY_CPU, pid);
s->parent.target_pid = pid;
process = lttv_state_find_process(ts, ANY_CPU, pid);
- es = &g_array_index(process->execution_stack, LttvExecutionState, 0);
+ process->execution_stack =
+ g_array_set_size(process->execution_stack, 1);
+ es = process->state =
+ &g_array_index(process->execution_stack, LttvExecutionState, 0);
es->t = LTTV_STATE_SYSCALL;
process->type = LTTV_STATE_KERNEL_THREAD;
es->t = LTTV_STATE_SYSCALL;
process->type = LTTV_STATE_KERNEL_THREAD;
@@
-2361,6
+2366,7
@@
static gboolean process_exec(void *hook_data, void *call_data)
guint cpu = s->cpu;
LttvProcessState *process = ts->running_process[cpu];
guint cpu = s->cpu;
LttvProcessState *process = ts->running_process[cpu];
+#if 0//how to use a sequence that must be transformed in a string
/* PID of the process to release */
guint64 name_len = ltt_event_field_element_number(e, thf->f1);
//name = ltt_event_get_string(e, thf->f1);
/* PID of the process to release */
guint64 name_len = ltt_event_field_element_number(e, thf->f1);
//name = ltt_event_get_string(e, thf->f1);
@@
-2370,10
+2376,12
@@
static gboolean process_exec(void *hook_data, void *call_data)
gchar *null_term_name = g_new(gchar, name_len+1);
memcpy(null_term_name, name_begin, name_len);
null_term_name[name_len] = '\0';
gchar *null_term_name = g_new(gchar, name_len+1);
memcpy(null_term_name, name_begin, name_len);
null_term_name[name_len] = '\0';
-
process->name = g_quark_from_string(null_term_name);
process->name = g_quark_from_string(null_term_name);
+#endif //0
+
+ process->name = g_quark_from_string(ltt_event_get_string(e, thf->f1));
process->brand = LTTV_STATE_UNBRANDED;
process->brand = LTTV_STATE_UNBRANDED;
- g_free(null_term_name);
+
//
g_free(null_term_name);
return FALSE;
}
return FALSE;
}
@@
-2426,7
+2434,9
@@
static void fix_process(gpointer key, gpointer value,
es->s = LTTV_STATE_RUN;
if(process->execution_stack->len == 1) {
es->s = LTTV_STATE_RUN;
if(process->execution_stack->len == 1) {
- /* Still in user mode, means never scheduled */
+ /* Still in bottom unknown mode, means never did a system call
+ * May be either in user mode, syscall mode, running or waiting.*/
+ /* FIXME : we may be tagging syscall mode when being user mode */
process->execution_stack =
g_array_set_size(process->execution_stack, 2);
es = process->state = &g_array_index(process->execution_stack,
process->execution_stack =
g_array_set_size(process->execution_stack, 2);
es = process->state = &g_array_index(process->execution_stack,
@@
-2437,7
+2447,8
@@
static void fix_process(gpointer key, gpointer value,
//g_assert(timestamp->tv_sec != 0);
es->change = *timestamp;
es->cum_cpu_time = ltt_time_zero;
//g_assert(timestamp->tv_sec != 0);
es->change = *timestamp;
es->cum_cpu_time = ltt_time_zero;
- es->s = LTTV_STATE_WAIT;
+ if(es->s == LTTV_STATE_WAIT_FORK)
+ es->s = LTTV_STATE_WAIT;
}
}
}
}
}
}
@@
-2678,13
+2689,13
@@
void lttv_state_add_event_hooks(LttvTracesetState *self)
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_ENTRY,
+ LTT_FACILITY_KERNEL
_ARCH
, LTT_EVENT_TRAP_ENTRY,
LTT_FIELD_TRAP_ID, 0, 0,
trap_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
LTT_FIELD_TRAP_ID, 0, 0,
trap_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_KERNEL, LTT_EVENT_TRAP_EXIT,
+ LTT_FACILITY_KERNEL
_ARCH
, LTT_EVENT_TRAP_EXIT,
0, 0, 0,
trap_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
0, 0, 0,
trap_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
@@
-2714,32
+2725,32
@@
void lttv_state_add_event_hooks(LttvTracesetState *self)
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
PROCESS, LTT_EVENT_SCHEDCHANG
E,
- LTT_FIELD_
OUT, LTT_FIELD_IN, LTT_FIELD_OUT
_STATE,
+ LTT_FACILITY_
KERNEL, LTT_EVENT_SCHED_SCHEDUL
E,
+ LTT_FIELD_
PREV_PID, LTT_FIELD_NEXT_PID, LTT_FIELD_PREV
_STATE,
schedchange, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
schedchange, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
PROCESS, LTT_EVENT
_FORK,
- LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, LTT_FIELD_TGID,
+ LTT_FACILITY_
KERNEL, LTT_EVENT_PROCESS
_FORK,
+ LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, LTT_FIELD_
CHILD_
TGID,
process_fork, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
process_fork, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
PROCESS, LTT_EVENT_KERNEL_THREAD
,
+ LTT_FACILITY_
KERNEL_ARCH, LTT_EVENT_KTHREAD_CREATE
,
LTT_FIELD_PID, 0, 0,
process_kernel_thread, NULL, &g_array_index(hooks, LttvTraceHook,
hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
LTT_FIELD_PID, 0, 0,
process_kernel_thread, NULL, &g_array_index(hooks, LttvTraceHook,
hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
PROCESS, LTT_EVENT
_EXIT,
+ LTT_FACILITY_
KERNEL, LTT_EVENT_PROCESS
_EXIT,
LTT_FIELD_PID, 0, 0,
process_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
LTT_FIELD_PID, 0, 0,
process_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
PROCESS, LTT_EVENT
_FREE,
+ LTT_FACILITY_
KERNEL, LTT_EVENT_PROCESS
_FREE,
LTT_FIELD_PID, 0, 0,
process_free, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
LTT_FIELD_PID, 0, 0,
process_free, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
@@
-2758,13
+2769,13
@@
void lttv_state_add_event_hooks(LttvTracesetState *self)
/* statedump-related hooks */
ret = lttv_trace_find_hook(ts->parent.t,
/* statedump-related hooks */
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
STATEDUMP, LTT_EVENT_ENUM
_PROCESS_STATE,
+ LTT_FACILITY_
LIST, LTT_EVENT
_PROCESS_STATE,
LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME,
enum_process_state, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME,
enum_process_state, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
ret = lttv_trace_find_hook(ts->parent.t,
- LTT_FACILITY_
STATEDUMP
, LTT_EVENT_STATEDUMP_END,
+ LTT_FACILITY_
LIST
, LTT_EVENT_STATEDUMP_END,
0, 0, 0,
statedump_end, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
0, 0, 0,
statedump_end, NULL, &g_array_index(hooks, LttvTraceHook, hn++));
if(ret) hn--;
@@
-3454,9
+3465,8
@@
static void module_init()
LTT_FACILITY_KERNEL = g_quark_from_string("kernel");
LTT_FACILITY_KERNEL_ARCH = g_quark_from_string("kernel_arch");
LTT_FACILITY_KERNEL = g_quark_from_string("kernel");
LTT_FACILITY_KERNEL_ARCH = g_quark_from_string("kernel_arch");
- LTT_FACILITY_PROCESS = g_quark_from_string("process");
LTT_FACILITY_FS = g_quark_from_string("fs");
LTT_FACILITY_FS = g_quark_from_string("fs");
- LTT_FACILITY_
STATEDUMP = g_quark_from_string("statedump
");
+ LTT_FACILITY_
LIST = g_quark_from_string("list
");
LTT_FACILITY_USER_GENERIC = g_quark_from_string("user_generic");
LTT_FACILITY_USER_GENERIC = g_quark_from_string("user_generic");
@@
-3468,13
+3478,13
@@
static void module_init()
LTT_EVENT_IRQ_EXIT = g_quark_from_string("irq_exit");
LTT_EVENT_SOFT_IRQ_ENTRY = g_quark_from_string("soft_irq_entry");
LTT_EVENT_SOFT_IRQ_EXIT = g_quark_from_string("soft_irq_exit");
LTT_EVENT_IRQ_EXIT = g_quark_from_string("irq_exit");
LTT_EVENT_SOFT_IRQ_ENTRY = g_quark_from_string("soft_irq_entry");
LTT_EVENT_SOFT_IRQ_EXIT = g_quark_from_string("soft_irq_exit");
- LTT_EVENT_SCHED
CHANGE = g_quark_from_string("schedchang
e");
- LTT_EVENT_
FORK = g_quark_from_string("
fork");
- LTT_EVENT_K
ERNEL_THREAD = g_quark_from_string("kernel_thread
");
- LTT_EVENT_
EXIT = g_quark_from_string("
exit");
- LTT_EVENT_
FREE = g_quark_from_string("
free");
+ LTT_EVENT_SCHED
_SCHEDULE = g_quark_from_string("sched_schedul
e");
+ LTT_EVENT_
PROCESS_FORK = g_quark_from_string("process_
fork");
+ LTT_EVENT_K
THREAD_CREATE = g_quark_from_string("kthread_create
");
+ LTT_EVENT_
PROCESS_EXIT = g_quark_from_string("process_
exit");
+ LTT_EVENT_
PROCESS_FREE = g_quark_from_string("process_
free");
LTT_EVENT_EXEC = g_quark_from_string("exec");
LTT_EVENT_EXEC = g_quark_from_string("exec");
- LTT_EVENT_
ENUM_PROCESS_STATE = g_quark_from_string("enumerate_
process_state");
+ LTT_EVENT_
PROCESS_STATE = g_quark_from_string("
process_state");
LTT_EVENT_STATEDUMP_END = g_quark_from_string("statedump_end");
LTT_EVENT_FUNCTION_ENTRY = g_quark_from_string("function_entry");
LTT_EVENT_FUNCTION_EXIT = g_quark_from_string("function_exit");
LTT_EVENT_STATEDUMP_END = g_quark_from_string("statedump_end");
LTT_EVENT_FUNCTION_ENTRY = g_quark_from_string("function_entry");
LTT_EVENT_FUNCTION_EXIT = g_quark_from_string("function_exit");
@@
-3485,13
+3495,14
@@
static void module_init()
LTT_FIELD_TRAP_ID = g_quark_from_string("trap_id");
LTT_FIELD_IRQ_ID = g_quark_from_string("irq_id");
LTT_FIELD_SOFT_IRQ_ID = g_quark_from_string("softirq_id");
LTT_FIELD_TRAP_ID = g_quark_from_string("trap_id");
LTT_FIELD_IRQ_ID = g_quark_from_string("irq_id");
LTT_FIELD_SOFT_IRQ_ID = g_quark_from_string("softirq_id");
- LTT_FIELD_
OUT = g_quark_from_string("out
");
- LTT_FIELD_
IN = g_quark_from_string("in
");
- LTT_FIELD_
OUT_STATE = g_quark_from_string("out
_state");
+ LTT_FIELD_
PREV_PID = g_quark_from_string("prev_pid
");
+ LTT_FIELD_
NEXT_PID = g_quark_from_string("next_pid
");
+ LTT_FIELD_
PREV_STATE = g_quark_from_string("prev
_state");
LTT_FIELD_PARENT_PID = g_quark_from_string("parent_pid");
LTT_FIELD_CHILD_PID = g_quark_from_string("child_pid");
LTT_FIELD_PID = g_quark_from_string("pid");
LTT_FIELD_TGID = g_quark_from_string("tgid");
LTT_FIELD_PARENT_PID = g_quark_from_string("parent_pid");
LTT_FIELD_CHILD_PID = g_quark_from_string("child_pid");
LTT_FIELD_PID = g_quark_from_string("pid");
LTT_FIELD_TGID = g_quark_from_string("tgid");
+ LTT_FIELD_CHILD_TGID = g_quark_from_string("child_tgid");
LTT_FIELD_FILENAME = g_quark_from_string("filename");
LTT_FIELD_NAME = g_quark_from_string("name");
LTT_FIELD_TYPE = g_quark_from_string("type");
LTT_FIELD_FILENAME = g_quark_from_string("filename");
LTT_FIELD_NAME = g_quark_from_string("name");
LTT_FIELD_TYPE = g_quark_from_string("type");
This page took
0.028509 seconds
and
4
git commands to generate.