X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=06d22007b1beb1c3f01feec428a5247e1153b9d8;hb=43fb1d98c1e2bfc231a4c6a3a7f03c912f49ca48;hp=935b3bba4aae37f1960aed4d8e0e0ef8c94df869;hpb=e1de4b54dd75cfe38d496cede2bb77c10cc77faf;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 935b3bba..06d22007 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -104,8 +105,7 @@ GQuark LTT_FIELD_MINOR, LTT_FIELD_MAJOR, LTT_FIELD_OPERATION, - LTT_FIELD_ACTION, - LTT_FIELD_NUM; + LTT_FIELD_ACTION; LttvExecutionMode LTTV_STATE_MODE_UNKNOWN, @@ -195,7 +195,6 @@ static LttvBdevState *bdevstate_new(void); static void bdevstate_free(LttvBdevState *); static void bdevstate_free_cb(gpointer key, gpointer value, gpointer user_data); static LttvBdevState *bdevstate_copy(LttvBdevState *bds); -static LttvBdevState *bdev_state_get(LttvTraceState *ts, guint16 devcode); void lttv_state_save(LttvTraceState *self, LttvAttribute *container) @@ -1615,11 +1614,7 @@ typedef struct _LttvNameTables { static void create_name_tables(LttvTraceState *tcs) { - int i, nb; - - LttvTraceHook h; - - LttType *t; + int i; GString *fe_name = g_string_new(""); @@ -1627,65 +1622,67 @@ create_name_tables(LttvTraceState *tcs) LttvAttributeValue v; + GArray *hooks; + lttv_attribute_find(tcs->parent.t_a, LTTV_STATE_NAME_TABLES, LTTV_POINTER, &v); g_assert(*(v.v_pointer) == NULL); *(v.v_pointer) = name_tables; + hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 1); + if(!lttv_trace_find_hook(tcs->parent.t, + LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY, - LTT_FIELD_SYSCALL_ID, 0, 0, - NULL, NULL, &h)) { - - thf = lttv_trace_hook_get_first(&h); + FIELD_ARRAY(LTT_FIELD_SYSCALL_ID), + NULL, NULL, &hooks)) { - t = ltt_field_type(thf->f1); - nb = ltt_type_element_number(t); - - lttv_trace_hook_destroy(&h); - - name_tables->syscall_names = g_new(GQuark, nb); - name_tables->nb_syscalls = nb; - - for(i = 0 ; i < nb ; i++) { - name_tables->syscall_names[i] = ltt_enum_string_get(t, i); - if(!name_tables->syscall_names[i]) { - GString *string = g_string_new(""); - g_string_printf(string, "syscall %u", i); - name_tables->syscall_names[i] = g_quark_from_string(string->str); - g_string_free(string, TRUE); - } +// th = lttv_trace_hook_get_first(&th); +// +// t = ltt_field_type(lttv_trace_get_hook_field(th, 0)); +// nb = ltt_type_element_number(t); +// +// name_tables->syscall_names = g_new(GQuark, nb); +// name_tables->nb_syscalls = nb; +// +// for(i = 0 ; i < nb ; i++) { +// name_tables->syscall_names[i] = ltt_enum_string_get(t, i); +// if(!name_tables->syscall_names[i]) { +// GString *string = g_string_new(""); +// g_string_printf(string, "syscall %u", i); +// name_tables->syscall_names[i] = g_quark_from_string(string->str); +// g_string_free(string, TRUE); +// } +// } + + name_tables->syscall_names = g_new(GQuark, 256); + for(i = 0 ; i < 256 ; i++) { + g_string_printf(fe_name, "syscall %d", i); + name_tables->syscall_names[i] = g_quark_from_string(fe_name->str); } - - //name_tables->syscall_names = g_new(GQuark, 256); - //for(i = 0 ; i < 256 ; i++) { - // g_string_printf(fe_name, "syscall %d", i); - // name_tables->syscall_names[i] = g_quark_from_string(fe_name->str); - //} } else { name_tables->syscall_names = NULL; name_tables->nb_syscalls = 0; } + lttv_trace_hook_remove_all(&hooks); 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)) { - - thf = lttv_trace_hook_get_first(&h); + FIELD_ARRAY(LTT_FIELD_TRAP_ID), + NULL, NULL, &hooks)) { + +// th = lttv_trace_hook_get_first(&th); +// +// t = ltt_field_type(lttv_trace_get_hook_field(th, 0)); +// //nb = ltt_type_element_number(t); +// +// name_tables->trap_names = g_new(GQuark, nb); +// for(i = 0 ; i < nb ; i++) { +// name_tables->trap_names[i] = g_quark_from_string( +// ltt_enum_string_get(t, i)); +// } - t = ltt_field_type(thf->f1); - //nb = ltt_type_element_number(t); - - lttv_trace_hook_destroy(&h); - - /* - name_tables->trap_names = g_new(GQuark, nb); - for(i = 0 ; i < nb ; i++) { - name_tables->trap_names[i] = g_quark_from_string( - ltt_enum_string_get(t, i)); - } - */ name_tables->nb_traps = 256; name_tables->trap_names = g_new(GQuark, 256); for(i = 0 ; i < 256 ; i++) { @@ -1696,19 +1693,14 @@ create_name_tables(LttvTraceState *tcs) name_tables->trap_names = NULL; name_tables->nb_traps = 0; } + lttv_trace_hook_remove_all(&hooks); if(!lttv_trace_find_hook(tcs->parent.t, + LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, - LTT_FIELD_IRQ_ID, 0, 0, - NULL, NULL, &h)) { - - thf = lttv_trace_hook_get_first(&h); + FIELD_ARRAY(LTT_FIELD_IRQ_ID), + NULL, NULL, &hooks)) { - t = ltt_field_type(thf->f1); - //nb = ltt_type_element_number(t); - - lttv_trace_hook_destroy(&h); - /* name_tables->irq_names = g_new(GQuark, nb); for(i = 0 ; i < nb ; i++) { @@ -1726,6 +1718,7 @@ create_name_tables(LttvTraceState *tcs) name_tables->nb_irqs = 0; name_tables->irq_names = NULL; } + lttv_trace_hook_remove_all(&hooks); /* name_tables->soft_irq_names = g_new(GQuark, nb); for(i = 0 ; i < nb ; i++) { @@ -1739,7 +1732,7 @@ create_name_tables(LttvTraceState *tcs) g_string_printf(fe_name, "softirq %d", i); name_tables->soft_irq_names[i] = g_quark_from_string(fe_name->str); } - + g_array_free(hooks, TRUE); g_string_free(fe_name, TRUE); } @@ -2159,8 +2152,8 @@ static gboolean syscall_entry(void *hook_data, void *call_data) LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process = ts->running_process[cpu]; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - LttField *f = thf->f1; + LttvTraceHook *th = (LttvTraceHook *)hook_data; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; @@ -2202,8 +2195,8 @@ static gboolean trap_entry(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - LttField *f = thf->f1; + LttvTraceHook *th = (LttvTraceHook *)hook_data; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; @@ -2245,18 +2238,13 @@ static gboolean irq_entry(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState *)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - guint8 fac_id = ltt_event_facility_id(e); - guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - // g_assert(lttv_trace_hook_get_first((LttvTraceHook *)hook_data)->f1 != NULL); - g_assert(thf->f1 != NULL); - // g_assert(thf == lttv_trace_hook_get_first((LttvTraceHook *)hook_data)); - LttField *f = thf->f1; + //guint8 ev_id = ltt_event_eventtype_id(e); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; guint64 irq = ltt_event_get_long_unsigned(e, f); guint64 nb_irqs = ((LttvTraceState *)(s->parent.t_context))->nb_irqs; - GString *string; if(irq < nb_irqs) { submode = ((LttvTraceState *)(s->parent.t_context))->irq_names[irq]; @@ -2311,18 +2299,13 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - guint8 fac_id = ltt_event_facility_id(e); - guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - // g_assert(lttv_trace_hook_get_first((LttvTraceHook *)hook_data)->f1 != NULL); - g_assert(thf->f1 != NULL); - // g_assert(thf == lttv_trace_hook_get_first((LttvTraceHook *)hook_data)); - LttField *f = thf->f1; + //guint8 ev_id = ltt_event_eventtype_id(e); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; guint64 softirq = ltt_event_get_long_unsigned(e, f); guint64 nb_softirqs = ((LttvTraceState *)(s->parent.t_context))->nb_softirqs; - GString *string; if(softirq < nb_softirqs) { submode = ((LttvTraceState *)(s->parent.t_context))->soft_irq_names[softirq]; @@ -2344,12 +2327,12 @@ static gboolean enum_interrupt(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState *)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - guint8 fac_id = ltt_event_facility_id(e); - guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + //guint8 ev_id = ltt_event_eventtype_id(e); + LttvTraceHook *th = (LttvTraceHook *)hook_data; - GQuark action = g_quark_from_string(ltt_event_get_string(e, thf->f1)); - guint irq = ltt_event_get_long_unsigned(e, thf->f2); + GQuark action = g_quark_from_string(ltt_event_get_string(e, + lttv_trace_get_hook_field(th, 0))); + guint irq = ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 1)); ts->irq_names[irq] = action; @@ -2362,13 +2345,15 @@ static gboolean bdev_request_issue(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState *)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - guint8 fac_id = ltt_event_facility_id(e); - guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - - guint major = ltt_event_get_long_unsigned(e, thf->f1); - guint minor = ltt_event_get_long_unsigned(e, thf->f2); - guint oper = ltt_event_get_long_unsigned(e, thf->f3); + //guint8 ev_id = ltt_event_eventtype_id(e); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + + guint major = ltt_event_get_long_unsigned(e, + lttv_trace_get_hook_field(th, 0)); + guint minor = ltt_event_get_long_unsigned(e, + lttv_trace_get_hook_field(th, 1)); + guint oper = ltt_event_get_long_unsigned(e, + lttv_trace_get_hook_field(th, 2)); guint16 devcode = MKDEV(major,minor); /* have we seen this block device before? */ @@ -2387,11 +2372,14 @@ static gboolean bdev_request_complete(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState *)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - - guint major = ltt_event_get_long_unsigned(e, thf->f1); - guint minor = ltt_event_get_long_unsigned(e, thf->f2); - guint oper = ltt_event_get_long_unsigned(e, thf->f3); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + + guint major = ltt_event_get_long_unsigned(e, + lttv_trace_get_hook_field(th, 0)); + guint minor = ltt_event_get_long_unsigned(e, + lttv_trace_get_hook_field(th, 1)); + //guint oper = ltt_event_get_long_unsigned(e, + // lttv_trace_get_hook_field(th, 2)); guint16 devcode = MKDEV(major,minor); /* have we seen this block device before? */ @@ -2413,7 +2401,7 @@ static void push_function(LttvTracefileState *tfs, guint64 funcptr) guint depth = process->user_stack->len; - process->user_stack = + process->user_stack = g_array_set_size(process->user_stack, depth + 1); new_func = &g_array_index(process->user_stack, guint64, depth); @@ -2459,11 +2447,9 @@ static gboolean function_entry(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - guint8 fac_id = ltt_event_facility_id(e); - guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - g_assert(thf->f1 != NULL); - LttField *f = thf->f1; + //guint8 ev_id = ltt_event_eventtype_id(e); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); guint64 funcptr = ltt_event_get_long_unsigned(e, f); push_function(s, funcptr); @@ -2474,15 +2460,11 @@ static gboolean function_exit(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - guint8 fac_id = ltt_event_facility_id(e); - guint8 ev_id = ltt_event_eventtype_id(e); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - g_assert(thf->f1 != NULL); - LttField *f = thf->f1; + //guint8 ev_id = ltt_event_eventtype_id(e); + LttvTraceHook *th = (LttvTraceHook *)hook_data; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); guint64 funcptr = ltt_event_get_long_unsigned(e, f); - LttvExecutionSubmode submode; - pop_function(s, funcptr); return FALSE; } @@ -2493,16 +2475,16 @@ static gboolean schedchange(void *hook_data, void *call_data) guint cpu = s->cpu; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process = ts->running_process[cpu]; - LttvProcessState *old_process = ts->running_process[cpu]; + //LttvProcessState *old_process = ts->running_process[cpu]; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; guint pid_in, pid_out; gint64 state_out; - pid_out = ltt_event_get_unsigned(e, thf->f1); - pid_in = ltt_event_get_unsigned(e, thf->f2); - state_out = ltt_event_get_long_int(e, thf->f3); + pid_out = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 0)); + pid_in = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1)); + state_out = ltt_event_get_long_int(e, lttv_trace_get_hook_field(th, 2)); if(likely(process != NULL)) { @@ -2569,26 +2551,30 @@ static gboolean process_fork(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; guint parent_pid; guint child_pid; /* In the Linux Kernel, there is one PID per thread. */ guint child_tgid; /* tgid in the Linux kernel is the "real" POSIX PID. */ - LttvProcessState *zombie_process; + //LttvProcessState *zombie_process; guint cpu = s->cpu; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process = ts->running_process[cpu]; LttvProcessState *child_process; + struct marker_field *f; /* Parent PID */ - parent_pid = ltt_event_get_unsigned(e, thf->f1); + parent_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 0)); /* Child PID */ - child_pid = ltt_event_get_unsigned(e, thf->f2); + child_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1)); s->parent.target_pid = child_pid; /* Child TGID */ - if(thf->f3) child_tgid = ltt_event_get_unsigned(e, thf->f3); - else child_tgid = 0; + f = lttv_trace_get_hook_field(th, 2); + if (likely(f)) + child_tgid = ltt_event_get_unsigned(e, f); + else + child_tgid = 0; /* Mathieu : it seems like the process might have been scheduled in before the * fork, and, in a rare case, might be the current process. This might happen @@ -2644,15 +2630,14 @@ static gboolean process_kernel_thread(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; guint pid; - guint cpu = s->cpu; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process; LttvExecutionState *es; /* PID */ - pid = (guint)ltt_event_get_long_unsigned(e, thf->f1); + pid = (guint)ltt_event_get_long_unsigned(e, lttv_trace_get_hook_field(th, 0)); s->parent.target_pid = pid; process = lttv_state_find_process_or_create(ts, ANY_CPU, pid, @@ -2671,14 +2656,12 @@ static gboolean process_exit(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; - LttField *f; + LttvTraceHook *th = (LttvTraceHook *)hook_data; guint pid; - guint cpu = s->cpu; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process; // = ts->running_process[cpu]; - pid = ltt_event_get_unsigned(e, thf->f1); + pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 0)); s->parent.target_pid = pid; // FIXME : Add this test in the "known state" section @@ -2696,12 +2679,12 @@ static gboolean process_free(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; guint release_pid; LttvProcessState *process; /* PID of the process to release */ - release_pid = ltt_event_get_unsigned(e, thf->f1); + release_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 0)); s->parent.target_pid = release_pid; g_assert(release_pid != 0); @@ -2743,16 +2726,18 @@ static gboolean process_exec(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; //gchar *name; 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); - LttField *child = ltt_event_field_element_select(e, thf->f1, 0); + guint64 name_len = ltt_event_field_element_number(e, + lttv_trace_get_hook_field(th, 0)); + //name = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 0)); + LttField *child = ltt_event_field_element_select(e, + lttv_trace_get_hook_field(th, 0), 0); gchar *name_begin = (gchar*)(ltt_event_data(e)+ltt_event_field_offset(e, child)); gchar *null_term_name = g_new(gchar, name_len+1); @@ -2761,7 +2746,8 @@ static gboolean process_exec(void *hook_data, void *call_data) 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->name = g_quark_from_string(ltt_event_get_string(e, + lttv_trace_get_hook_field(th, 0))); process->brand = LTTV_STATE_UNBRANDED; //g_free(null_term_name); return FALSE; @@ -2772,12 +2758,12 @@ static gboolean thread_brand(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; gchar *name; guint cpu = s->cpu; LttvProcessState *process = ts->running_process[cpu]; - name = ltt_event_get_string(e, thf->f1); + name = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 0)); process->brand = g_quark_from_string(name); return FALSE; @@ -2789,7 +2775,6 @@ static void fix_process(gpointer key, gpointer value, LttvProcessState *process; LttvExecutionState *es; process = (LttvProcessState *)value; - LttvTracefileContext *tfc = (LttvTracefileContext *)user_data; LttTime *timestamp = (LttTime*)user_data; if(process->type == LTTV_STATE_KERNEL_THREAD) { @@ -2841,14 +2826,16 @@ static gboolean statedump_end(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvTracefileContext *tfc = (LttvTracefileContext *)call_data; - LttEvent *e = ltt_tracefile_get_event(s->parent.tf); - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + //LttEvent *e = ltt_tracefile_get_event(s->parent.tf); + //LttvTraceHook *th = (LttvTraceHook *)hook_data; /* For all processes */ /* if kernel thread, if stack[0] is unknown, set to syscall mode, wait */ /* else, if stack[0] is unknown, set to user mode, running */ g_hash_table_foreach(ts->processes, fix_process, &tfc->timestamp); + + return FALSE; } static gboolean enum_process_state(void *hook_data, void *call_data) @@ -2856,9 +2843,7 @@ static gboolean enum_process_state(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); //It's slow : optimise later by doing this before reading trace. - LttEventType *et = ltt_event_eventtype(e); - // - LttvTraceHookByFacility *thf = (LttvTraceHookByFacility *)hook_data; + LttvTraceHook *th = (LttvTraceHook *)hook_data; guint parent_pid; guint pid; guint tgid; @@ -2867,46 +2852,43 @@ static gboolean enum_process_state(void *hook_data, void *call_data) LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process = ts->running_process[cpu]; LttvProcessState *parent_process; - LttField *f4, *f5, *f6, *f7, *f8; + struct marker_field *f; GQuark type, mode, submode, status; LttvExecutionState *es; guint i, nb_cpus; /* PID */ - pid = ltt_event_get_unsigned(e, thf->f1); + pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 0)); s->parent.target_pid = pid; /* Parent PID */ - parent_pid = ltt_event_get_unsigned(e, thf->f2); + parent_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1)); /* Command name */ - command = ltt_event_get_string(e, thf->f3); + command = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 2)); /* type */ - f4 = ltt_eventtype_field_by_name(et, LTT_FIELD_TYPE); - type = ltt_enum_string_get(ltt_field_type(f4), - ltt_event_get_unsigned(e, f4)); + f = lttv_trace_get_hook_field(th, 3); + type = ltt_enum_string_get(f, ltt_event_get_unsigned(e, f)); /* mode */ - f5 = ltt_eventtype_field_by_name(et, LTT_FIELD_MODE); - mode = ltt_enum_string_get(ltt_field_type(f5), - ltt_event_get_unsigned(e, f5)); + f = lttv_trace_get_hook_field(th, 4); + mode = ltt_enum_string_get(f,ltt_event_get_unsigned(e, f)); /* submode */ - f6 = ltt_eventtype_field_by_name(et, LTT_FIELD_SUBMODE); - submode = ltt_enum_string_get(ltt_field_type(f6), - ltt_event_get_unsigned(e, f6)); + f = lttv_trace_get_hook_field(th, 5); + submode = ltt_enum_string_get(f, ltt_event_get_unsigned(e, f)); /* status */ - f7 = ltt_eventtype_field_by_name(et, LTT_FIELD_STATUS); - status = ltt_enum_string_get(ltt_field_type(f7), - ltt_event_get_unsigned(e, f7)); + f = lttv_trace_get_hook_field(th, 6); + status = ltt_enum_string_get(f, ltt_event_get_unsigned(e, f)); /* TGID */ - f8 = ltt_eventtype_field_by_name(et, LTT_FIELD_TGID); - if(f8) tgid = ltt_event_get_unsigned(e, f8); - else tgid = 0; - + f = lttv_trace_get_hook_field(th, 7); + if(f) + tgid = ltt_event_get_unsigned(e, f); + else + tgid = 0; if(pid == 0) { nb_cpus = ltt_trace_get_num_cpu(ts->parent.t); @@ -3030,7 +3012,7 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) { LttvTraceset *traceset = self->parent.ts; - guint i, j, k, l, nb_trace, nb_tracefile; + guint i, j, k, nb_trace, nb_tracefile; LttvTraceState *ts; @@ -3038,15 +3020,10 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) GArray *hooks; - LttvTraceHookByFacility *thf; + LttvTraceHook *th; - LttvTraceHook *hook; - LttvAttributeValue val; - gint ret; - gint hn; - nb_trace = lttv_traceset_number(traceset); for(i = 0 ; i < nb_trace ; i++) { ts = (LttvTraceState *)self->parent.traces[i]; @@ -3055,145 +3032,146 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) associated by id hooks. */ hooks = g_array_sized_new(FALSE, FALSE, sizeof(LttvTraceHook), 19); - hooks = g_array_set_size(hooks, 19); // Max possible number of hooks. - hn = 0; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_ENTRY, - LTT_FIELD_SYSCALL_ID, 0, 0, - syscall_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL_ARCH, LTT_EVENT_SYSCALL_EXIT, - 0, 0, 0, - syscall_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - 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_FACILITY_KERNEL_ARCH, LTT_EVENT_TRAP_EXIT, - 0, 0, 0, - trap_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_ENTRY, - LTT_FIELD_IRQ_ID, 0, 0, - irq_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_IRQ_EXIT, - 0, 0, 0, - irq_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_SOFT_IRQ_ENTRY, - LTT_FIELD_SOFT_IRQ_ID, 0, 0, - soft_irq_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_SOFT_IRQ_EXIT, - 0, 0, 0, - soft_irq_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_SCHED_SCHEDULE, - 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, - 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, - 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_FACILITY_KERNEL, LTT_EVENT_PROCESS_EXIT, - LTT_FIELD_PID, 0, 0, - process_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; + //hooks = g_array_set_size(hooks, 19); // Max possible number of hooks. + //hn = 0; + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL_ARCH, + LTT_EVENT_SYSCALL_ENTRY, + FIELD_ARRAY(LTT_FIELD_SYSCALL_ID), + syscall_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL_ARCH, + LTT_EVENT_SYSCALL_EXIT, + NULL, + syscall_exit, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL_ARCH, + LTT_EVENT_TRAP_ENTRY, + FIELD_ARRAY(LTT_FIELD_TRAP_ID), + trap_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL_ARCH, + LTT_EVENT_TRAP_EXIT, + NULL, + trap_exit, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_IRQ_ENTRY, + FIELD_ARRAY(LTT_FIELD_IRQ_ID), + irq_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_IRQ_EXIT, + NULL, + irq_exit, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_SOFT_IRQ_ENTRY, + FIELD_ARRAY(LTT_FIELD_SOFT_IRQ_ID), + soft_irq_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_SOFT_IRQ_EXIT, + NULL, + soft_irq_exit, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_SCHED_SCHEDULE, + FIELD_ARRAY(LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, + LTT_FIELD_PREV_STATE), + schedchange, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_PROCESS_FORK, + FIELD_ARRAY(LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, + LTT_FIELD_CHILD_TGID), + process_fork, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL_ARCH, + LTT_EVENT_KTHREAD_CREATE, + FIELD_ARRAY(LTT_FIELD_PID), + process_kernel_thread, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_PROCESS_EXIT, + FIELD_ARRAY(LTT_FIELD_PID), + process_exit, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_KERNEL, LTT_EVENT_PROCESS_FREE, - LTT_FIELD_PID, 0, 0, - process_free, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_FS, LTT_EVENT_EXEC, - LTT_FIELD_FILENAME, 0, 0, - process_exec, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, LTT_EVENT_THREAD_BRAND, - LTT_FIELD_NAME, 0, 0, - thread_brand, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_KERNEL, + LTT_EVENT_PROCESS_FREE, + FIELD_ARRAY(LTT_FIELD_PID), + process_free, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_FS, + LTT_EVENT_EXEC, + FIELD_ARRAY(LTT_FIELD_FILENAME), + process_exec, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_USER_GENERIC, + LTT_EVENT_THREAD_BRAND, + FIELD_ARRAY(LTT_FIELD_NAME), + thread_brand, NULL, &hooks); /* statedump-related hooks */ - ret = lttv_trace_find_hook(ts->parent.t, - 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_FACILITY_LIST, LTT_EVENT_STATEDUMP_END, - 0, 0, 0, - statedump_end, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_LIST, LTT_EVENT_LIST_INTERRUPT, - LTT_FIELD_ACTION, LTT_FIELD_NUM, 0, - enum_interrupt, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_BLOCK, LTT_EVENT_REQUEST_ISSUE, - LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION, - bdev_request_issue, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_BLOCK, LTT_EVENT_REQUEST_COMPLETE, - LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION, - bdev_request_complete, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, LTT_EVENT_FUNCTION_ENTRY, - LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE, 0, - function_entry, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - ret = lttv_trace_find_hook(ts->parent.t, - LTT_FACILITY_USER_GENERIC, LTT_EVENT_FUNCTION_EXIT, - LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE, 0, - function_exit, NULL, &g_array_index(hooks, LttvTraceHook, hn++)); - if(ret) hn--; - - hooks = g_array_set_size(hooks, hn); - + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_LIST, + LTT_EVENT_PROCESS_STATE, + FIELD_ARRAY(LTT_FIELD_PID, LTT_FIELD_PARENT_PID, LTT_FIELD_NAME, + LTT_FIELD_TYPE, LTT_FIELD_MODE, LTT_FIELD_SUBMODE, + LTT_FIELD_STATUS, LTT_FIELD_TGID), + enum_process_state, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_LIST, + LTT_EVENT_STATEDUMP_END, + NULL, + statedump_end, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_LIST, + LTT_EVENT_LIST_INTERRUPT, + FIELD_ARRAY(LTT_FIELD_ACTION, LTT_FIELD_IRQ_ID), + enum_interrupt, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_BLOCK, + LTT_EVENT_REQUEST_ISSUE, + FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION), + bdev_request_issue, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_BLOCK, + LTT_EVENT_REQUEST_COMPLETE, + FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION), + bdev_request_complete, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_USER_GENERIC, + LTT_EVENT_FUNCTION_ENTRY, + FIELD_ARRAY(LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE), + function_entry, NULL, &hooks); + + lttv_trace_find_hook(ts->parent.t, + LTT_FACILITY_USER_GENERIC, + LTT_EVENT_FUNCTION_EXIT, + FIELD_ARRAY(LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE), + function_exit, NULL, &hooks); + /* Add these hooks to each event_by_id hooks list */ nb_tracefile = ts->parent.tracefiles->len; @@ -3204,15 +3182,12 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) LttvTracefileContext*, j)); for(k = 0 ; k < hooks->len ; k++) { - hook = &g_array_index(hooks, LttvTraceHook, k); - for(l=0;lfac_list->len;l++) { - thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l); + th = &g_array_index(hooks, LttvTraceHook, k); lttv_hooks_add( - lttv_hooks_by_id_find(tfs->parent.event_by_id, thf->id), - thf->h, - thf, + lttv_hooks_by_id_find(tfs->parent.event_by_id, th->id), + th->h, + th, LTTV_PRIO_STATE); - } } } lttv_attribute_find(ts->parent.a, LTTV_STATE_HOOKS, LTTV_POINTER, &val); @@ -3233,7 +3208,7 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) { LttvTraceset *traceset = self->parent.ts; - guint i, j, k, l, nb_trace, nb_tracefile; + guint i, j, k, nb_trace, nb_tracefile; LttvTraceState *ts; @@ -3241,9 +3216,7 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) GArray *hooks; - LttvTraceHook *hook; - - LttvTraceHookByFacility *thf; + LttvTraceHook *th; LttvAttributeValue val; @@ -3264,19 +3237,14 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) LttvTracefileContext*, j)); for(k = 0 ; k < hooks->len ; k++) { - hook = &g_array_index(hooks, LttvTraceHook, k); - for(l=0;lfac_list->len;l++) { - thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l); - + th = &g_array_index(hooks, LttvTraceHook, k); lttv_hooks_remove_data( - lttv_hooks_by_id_find(tfs->parent.event_by_id, thf->id), - thf->h, - thf); - } + lttv_hooks_by_id_find(tfs->parent.event_by_id, th->id), + th->h, + th); } } - for(k = 0 ; k < hooks->len ; k++) - lttv_trace_hook_destroy(&g_array_index(hooks, LttvTraceHook, k)); + lttv_trace_hook_remove_all(&hooks); g_array_free(hooks, TRUE); } } @@ -3293,16 +3261,8 @@ static gboolean state_save_event_hook(void *hook_data, void *call_data) LttvTracefileState *self = (LttvTracefileState *)call_data; - LttvTracefileState *tfcs; - LttvTraceState *tcs = (LttvTraceState *)(self->parent.t_context); - LttEventPosition *ep; - - guint i; - - LttTracefile *tf; - LttvAttribute *saved_states_tree, *saved_state_tree; LttvAttributeValue value; @@ -3880,8 +3840,8 @@ static void module_init() LTT_EVENT_TRAP_EXIT = g_quark_from_string("trap_exit"); LTT_EVENT_IRQ_ENTRY = g_quark_from_string("irq_entry"); 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_SOFT_IRQ_ENTRY = g_quark_from_string("softirq_entry"); + LTT_EVENT_SOFT_IRQ_EXIT = g_quark_from_string("softirq_exit"); LTT_EVENT_SCHED_SCHEDULE = g_quark_from_string("sched_schedule"); LTT_EVENT_PROCESS_FORK = g_quark_from_string("process_fork"); LTT_EVENT_KTHREAD_CREATE = g_quark_from_string("kthread_create"); @@ -3922,7 +3882,6 @@ static void module_init() LTT_FIELD_MINOR = g_quark_from_string("minor"); LTT_FIELD_OPERATION = g_quark_from_string("direction"); LTT_FIELD_ACTION = g_quark_from_string("action"); - LTT_FIELD_NUM = g_quark_from_string("num"); LTTV_CPU_UNKNOWN = g_quark_from_string("unknown"); LTTV_CPU_IDLE = g_quark_from_string("idle");