X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=584ae3aeae281df07dc5e4f80f0697da89908708;hb=ac7460317fa57878383c21f402f58693389da85c;hp=792f9cefe517cfe00f1e88471866b509f04b3b28;hpb=eda0fe5f7955b829b31e05d57007f2940e128318;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 792f9cef..584ae3ae 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -21,12 +21,14 @@ #include #endif +#include #include #include #include #include #include #include +#include #include #include @@ -104,8 +106,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, @@ -167,6 +168,7 @@ static GQuark LTTV_STATE_NAME_TABLES, LTTV_STATE_TRACE_STATE_USE_COUNT, LTTV_STATE_RESOURCE_CPUS, + LTTV_STATE_RESOURCE_CPUS_COUNT, LTTV_STATE_RESOURCE_IRQS, LTTV_STATE_RESOURCE_BLKDEVS; @@ -1153,7 +1155,7 @@ static void lttv_state_free_cpu_states(LttvCPUState *states, guint n) guint i; for(i=0; imode_stack, FALSE); + g_array_free(bds->mode_stack, TRUE); g_free(bds); } @@ -1350,6 +1352,10 @@ static void state_save(LttvTraceState *self, LttvAttribute *container) /* save the cpu state */ { + value = lttv_attribute_add(container, LTTV_STATE_RESOURCE_CPUS_COUNT, + LTTV_UINT); + *(value.v_uint) = nb_cpus; + value = lttv_attribute_add(container, LTTV_STATE_RESOURCE_CPUS, LTTV_POINTER); *(value.v_pointer) = lttv_state_copy_cpu_states(self->cpu_states, nb_cpus); @@ -1478,7 +1484,7 @@ static void state_restore(LttvTraceState *self, LttvAttribute *container) static void state_saved_free(LttvTraceState *self, LttvAttribute *container) { - guint i, nb_tracefile, nb_cpus; + guint i, nb_tracefile, nb_cpus, nb_irqs; LttvTracefileState *tfcs; @@ -1507,13 +1513,31 @@ static void state_saved_free(LttvTraceState *self, LttvAttribute *container) lttv_attribute_remove_by_name(container, LTTV_STATE_PROCESSES); /* Free running processes array */ - nb_cpus = ltt_trace_get_num_cpu(self->parent.t); type = lttv_attribute_get_by_name(container, LTTV_STATE_RUNNING_PROCESS, &value); g_assert(type == LTTV_POINTER); running_process = *(value.v_pointer); g_free(running_process); + /* free cpu resource states */ + type = lttv_attribute_get_by_name(container, LTTV_STATE_RESOURCE_CPUS_COUNT, &value); + g_assert(type == LTTV_UINT); + nb_cpus = *value.v_uint; + type = lttv_attribute_get_by_name(container, LTTV_STATE_RESOURCE_CPUS, &value); + g_assert(type == LTTV_POINTER); + lttv_state_free_cpu_states(*(value.v_pointer), nb_cpus); + + /* free irq resource states */ + nb_irqs = self->nb_irqs; + type = lttv_attribute_get_by_name(container, LTTV_STATE_RESOURCE_IRQS, &value); + g_assert(type == LTTV_POINTER); + lttv_state_free_irq_states(*(value.v_pointer), nb_irqs); + + /* free the blkdev states */ + type = lttv_attribute_get_by_name(container, LTTV_STATE_RESOURCE_BLKDEVS, &value); + g_assert(type == LTTV_POINTER); + lttv_state_free_blkdev_hashtable(*(value.v_pointer)); + nb_tracefile = self->parent.tracefiles->len; for(i = 0 ; i < nb_tracefile ; i++) { @@ -1616,31 +1640,32 @@ create_name_tables(LttvTraceState *tcs) { int i; - LttvTraceHook th; - GString *fe_name = g_string_new(""); LttvNameTables *name_tables = g_new(LttvNameTables, 1); 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, FIELD_ARRAY(LTT_FIELD_SYSCALL_ID), - NULL, NULL)) { + NULL, NULL, &hooks)) { // th = lttv_trace_hook_get_first(&th); // -// t = ltt_field_type(th->f1); +// t = ltt_field_type(lttv_trace_get_hook_field(th, 0)); // nb = ltt_type_element_number(t); // - lttv_trace_hook_destroy(&th); -// // name_tables->syscall_names = g_new(GQuark, nb); // name_tables->nb_syscalls = nb; // @@ -1654,6 +1679,7 @@ create_name_tables(LttvTraceState *tcs) // } // } + name_tables->nb_syscalls = 256; name_tables->syscall_names = g_new(GQuark, 256); for(i = 0 ; i < 256 ; i++) { g_string_printf(fe_name, "syscall %d", i); @@ -1663,19 +1689,19 @@ create_name_tables(LttvTraceState *tcs) 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, &th)) { + FIELD_ARRAY(LTT_FIELD_TRAP_ID), + NULL, NULL, &hooks)) { // th = lttv_trace_hook_get_first(&th); // -// t = ltt_field_type(th->f1); +// t = ltt_field_type(lttv_trace_get_hook_field(th, 0)); // //nb = ltt_type_element_number(t); // - lttv_trace_hook_destroy(&th); - // name_tables->trap_names = g_new(GQuark, nb); // for(i = 0 ; i < nb ; i++) { // name_tables->trap_names[i] = g_quark_from_string( @@ -1692,14 +1718,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, &th)) { + FIELD_ARRAY(LTT_FIELD_IRQ_ID), + NULL, NULL, &hooks)) { - lttv_trace_hook_destroy(&th); - /* name_tables->irq_names = g_new(GQuark, nb); for(i = 0 ; i < nb ; i++) { @@ -1717,6 +1743,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++) { @@ -1730,7 +1757,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); } @@ -2151,7 +2178,7 @@ static gboolean syscall_entry(void *hook_data, void *call_data) LttvProcessState *process = ts->running_process[cpu]; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); LttvTraceHook *th = (LttvTraceHook *)hook_data; - struct marker_field *f = th->f1; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; @@ -2194,7 +2221,7 @@ static gboolean trap_entry(void *hook_data, void *call_data) LttvTracefileState *s = (LttvTracefileState *)call_data; LttEvent *e = ltt_tracefile_get_event(s->parent.tf); LttvTraceHook *th = (LttvTraceHook *)hook_data; - struct marker_field *f = th->f1; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; @@ -2238,8 +2265,7 @@ static gboolean irq_entry(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); //guint8 ev_id = ltt_event_eventtype_id(e); LttvTraceHook *th = (LttvTraceHook *)hook_data; - g_assert(th->f1 != NULL); - struct marker_field *f = th->f1; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; guint64 irq = ltt_event_get_long_unsigned(e, f); @@ -2300,8 +2326,7 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); //guint8 ev_id = ltt_event_eventtype_id(e); LttvTraceHook *th = (LttvTraceHook *)hook_data; - g_assert(th->f1 != NULL); - struct marker_field *f = th->f1; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); LttvExecutionSubmode submode; guint64 softirq = ltt_event_get_long_unsigned(e, f); @@ -2330,8 +2355,9 @@ static gboolean enum_interrupt(void *hook_data, void *call_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, th->f1)); - guint irq = ltt_event_get_long_unsigned(e, th->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; @@ -2347,9 +2373,12 @@ static gboolean bdev_request_issue(void *hook_data, void *call_data) //guint8 ev_id = ltt_event_eventtype_id(e); LttvTraceHook *th = (LttvTraceHook *)hook_data; - guint major = ltt_event_get_long_unsigned(e, th->f1); - guint minor = ltt_event_get_long_unsigned(e, th->f2); - guint oper = ltt_event_get_long_unsigned(e, th->f3); + 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? */ @@ -2370,9 +2399,12 @@ static gboolean bdev_request_complete(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); LttvTraceHook *th = (LttvTraceHook *)hook_data; - guint major = ltt_event_get_long_unsigned(e, th->f1); - guint minor = ltt_event_get_long_unsigned(e, th->f2); - //guint oper = ltt_event_get_long_unsigned(e, th->f3); + 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? */ @@ -2394,7 +2426,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); @@ -2442,8 +2474,7 @@ static gboolean function_entry(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); //guint8 ev_id = ltt_event_eventtype_id(e); LttvTraceHook *th = (LttvTraceHook *)hook_data; - g_assert(th->f1 != NULL); - struct marker_field *f = th->f1; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); guint64 funcptr = ltt_event_get_long_unsigned(e, f); push_function(s, funcptr); @@ -2456,8 +2487,7 @@ static gboolean function_exit(void *hook_data, void *call_data) LttEvent *e = ltt_tracefile_get_event(s->parent.tf); //guint8 ev_id = ltt_event_eventtype_id(e); LttvTraceHook *th = (LttvTraceHook *)hook_data; - g_assert(th->f1 != NULL); - struct marker_field *f = th->f1; + struct marker_field *f = lttv_trace_get_hook_field(th, 0); guint64 funcptr = ltt_event_get_long_unsigned(e, f); pop_function(s, funcptr); @@ -2477,9 +2507,9 @@ static gboolean schedchange(void *hook_data, void *call_data) guint pid_in, pid_out; gint64 state_out; - pid_out = ltt_event_get_unsigned(e, th->f1); - pid_in = ltt_event_get_unsigned(e, th->f2); - state_out = ltt_event_get_long_int(e, th->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)) { @@ -2535,9 +2565,18 @@ static gboolean schedchange(void *hook_data, void *call_data) /* update cpu status */ if(pid_in == 0) + /* going to idle task */ cpu_set_base_mode(s->cpu_state, LTTV_CPU_IDLE); - else + else { + /* scheduling a real task. + * we must be careful here: + * if we just schedule()'ed to a process that is + * in a trap, we must put the cpu in trap mode + */ cpu_set_base_mode(s->cpu_state, LTTV_CPU_BUSY); + if(process->state->t == LTTV_STATE_TRAP) + cpu_push_mode(s->cpu_state, LTTV_CPU_TRAP); + } return FALSE; } @@ -2555,17 +2594,21 @@ static gboolean process_fork(void *hook_data, void *call_data) 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, th->f1); + parent_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 0)); /* Child PID */ - child_pid = ltt_event_get_unsigned(e, th->f2); + child_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1)); s->parent.target_pid = child_pid; /* Child TGID */ - if(th->f3) child_tgid = ltt_event_get_unsigned(e, th->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 @@ -2628,7 +2671,7 @@ static gboolean process_kernel_thread(void *hook_data, void *call_data) LttvExecutionState *es; /* PID */ - pid = (guint)ltt_event_get_long_unsigned(e, th->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, @@ -2652,7 +2695,7 @@ static gboolean process_exit(void *hook_data, void *call_data) LttvTraceState *ts = (LttvTraceState*)s->parent.t_context; LttvProcessState *process; // = ts->running_process[cpu]; - pid = ltt_event_get_unsigned(e, th->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 @@ -2675,7 +2718,7 @@ static gboolean process_free(void *hook_data, void *call_data) LttvProcessState *process; /* PID of the process to release */ - release_pid = ltt_event_get_unsigned(e, th->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); @@ -2724,9 +2767,11 @@ static gboolean process_exec(void *hook_data, void *call_data) #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); @@ -2735,7 +2780,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, th->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; @@ -2751,7 +2797,7 @@ static gboolean thread_brand(void *hook_data, void *call_data) guint cpu = s->cpu; LttvProcessState *process = ts->running_process[cpu]; - name = ltt_event_get_string(e, th->f1); + name = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 0)); process->brand = g_quark_from_string(name); return FALSE; @@ -2840,53 +2886,45 @@ 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; - struct marker_field *f4, *f5, *f6, *f7, *f8; + struct marker_field *f; GQuark type, mode, submode, status; LttvExecutionState *es; guint i, nb_cpus; - struct marker_info *mi; /* PID */ - pid = ltt_event_get_unsigned(e, th->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, th->f2); + parent_pid = ltt_event_get_unsigned(e, lttv_trace_get_hook_field(th, 1)); /* Command name */ - command = ltt_event_get_string(e, th->f3); + command = ltt_event_get_string(e, lttv_trace_get_hook_field(th, 2)); /* type */ - mi = marker_get_info_from_id(ts->parent.t, e->event_id); - f4 = marker_get_field(mi, 3); - g_assert(f4->name == 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)); + + //FIXME: type is rarely used, enum must match possible types. /* mode */ - f5 = marker_get_field(mi, 4); - g_assert(f5->name == 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 = marker_get_field(mi, 5); - g_assert(f6->name == 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 = marker_get_field(mi, 6); - g_assert(f7->name == 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 = marker_get_field(mi, 7); - g_assert(f8->name == 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); @@ -3022,9 +3060,6 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) 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]; @@ -3033,145 +3068,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; + //hooks = g_array_set_size(hooks, 19); // Max possible number of hooks. + //hn = 0; - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_SYSCALL_ID), + syscall_entry, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + NULL, + syscall_exit, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_TRAP_ID), + trap_entry, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + NULL, + trap_exit, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_IRQ_ID), + irq_entry, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + NULL, + irq_exit, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_SOFT_IRQ_ID), + soft_irq_entry, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + NULL, + soft_irq_exit, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_PREV_PID, LTT_FIELD_NEXT_PID, + LTT_FIELD_PREV_STATE), + schedchange, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_PARENT_PID, LTT_FIELD_CHILD_PID, + LTT_FIELD_CHILD_TGID), + process_fork, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_PID), + process_kernel_thread, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_PID), + process_exit, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_PID), + process_free, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_FILENAME), + process_exec, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_NAME), + thread_brand, NULL, &hooks); /* statedump-related hooks */ - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + 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); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + NULL, + statedump_end, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_ACTION, LTT_FIELD_IRQ_ID), + enum_interrupt, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION), + bdev_request_issue, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_MAJOR, LTT_FIELD_MINOR, LTT_FIELD_OPERATION), + bdev_request_complete, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE), + function_entry, NULL, &hooks); - ret = lttv_trace_find_hook(ts->parent.t, + 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--; + FIELD_ARRAY(LTT_FIELD_THIS_FN, LTT_FIELD_CALL_SITE), + function_exit, NULL, &hooks); - hooks = g_array_set_size(hooks, hn); - /* Add these hooks to each event_by_id hooks list */ nb_tracefile = ts->parent.tracefiles->len; @@ -3244,8 +3280,7 @@ void lttv_state_remove_event_hooks(LttvTracesetState *self) 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); } } @@ -3791,8 +3826,8 @@ lttv_tracefile_state_get_type(void) static void module_init() { - LTTV_STATE_UNNAMED = g_quark_from_string("UNNAMED"); - LTTV_STATE_UNBRANDED = g_quark_from_string("UNBRANDED"); + LTTV_STATE_UNNAMED = g_quark_from_string(""); + LTTV_STATE_UNBRANDED = g_quark_from_string(""); LTTV_STATE_MODE_UNKNOWN = g_quark_from_string("MODE_UNKNOWN"); LTTV_STATE_USER_MODE = g_quark_from_string("USER_MODE"); LTTV_STATE_SYSCALL = g_quark_from_string("SYSCALL"); @@ -3823,6 +3858,7 @@ static void module_init() LTTV_STATE_TRACE_STATE_USE_COUNT = g_quark_from_string("trace_state_use_count"); LTTV_STATE_RESOURCE_CPUS = g_quark_from_string("cpu resource states"); + LTTV_STATE_RESOURCE_CPUS = g_quark_from_string("cpu count"); LTTV_STATE_RESOURCE_IRQS = g_quark_from_string("irq resource states"); LTTV_STATE_RESOURCE_BLKDEVS = g_quark_from_string("blkdevs resource states"); @@ -3841,8 +3877,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"); @@ -3883,7 +3919,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");