X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=e41af4501a9741225765e01775fabeacaa40dc5f;hb=5e29121ace19a4a4ea8685b56de16a624c06811b;hp=405c6e709175f8c376f7feda0ae89c36f5a82410;hpb=98d7814fdfbdbb83cc57d6d3ed758f8b8b86d244;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 405c6e70..e41af450 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -16,6 +16,7 @@ * MA 02111-1307, USA. */ +#define _GNU_SOURCE #ifdef HAVE_CONFIG_H #include #endif @@ -23,10 +24,8 @@ #include #include #include -#include #include #include -#include #include #include @@ -75,7 +74,8 @@ GQuark LTT_EVENT_FUNCTION_EXIT, LTT_EVENT_THREAD_BRAND, LTT_EVENT_REQUEST_ISSUE, - LTT_EVENT_REQUEST_COMPLETE; + LTT_EVENT_REQUEST_COMPLETE, + LTT_EVENT_LIST_INTERRUPT; /* Fields Quarks */ @@ -102,7 +102,9 @@ GQuark LTT_FIELD_CALL_SITE, LTT_FIELD_MINOR, LTT_FIELD_MAJOR, - LTT_FIELD_OPERATION; + LTT_FIELD_OPERATION, + LTT_FIELD_ACTION, + LTT_FIELD_NUM; LttvExecutionMode LTTV_STATE_MODE_UNKNOWN, @@ -354,7 +356,7 @@ state_load_saved_states(LttvTraceState *tcs) { FILE *fp; GPtrArray *quarktable; - char *trace_path; + const char *trace_path; char path[PATH_MAX]; guint count; guint i; @@ -607,7 +609,7 @@ static void write_process_state(gpointer key, gpointer value, } for(i = 0 ; i < process->user_stack->len; i++) { - address = &g_array_index(process->user_stack, guint64, i); + address = g_array_index(process->user_stack, guint64, i); fprintf(fp, " \n", address); } @@ -742,7 +744,7 @@ static void write_process_state_raw(gpointer key, gpointer value, } for(i = 0 ; i < process->user_stack->len; i++) { - address = &g_array_index(process->user_stack, guint64, i); + address = g_array_index(process->user_stack, guint64, i); fputc(HDR_USER_STACK, fp); fwrite(&address, sizeof(address), 1, fp); #if 0 @@ -1076,7 +1078,7 @@ void lttv_trace_states_read_raw(LttvTraceState *tcs, FILE *fp, } while(1); end_loop: *(tcs->max_time_state_recomputed_in_seek) = tcs->parent.time_span.end_time; - restore_init_state(tcs); + restore_init_state(&tcs->parent); lttv_process_trace_seek_time(tcs, ltt_time_zero); return; } @@ -1213,6 +1215,8 @@ static LttvBdevState *bdevstate_new(void) LttvBdevState *retval; retval = g_malloc(sizeof(LttvBdevState)); retval->mode_stack = g_array_new(FALSE, FALSE, sizeof(GQuark)); + + return retval; } static void bdevstate_free(LttvBdevState *bds) @@ -1234,6 +1238,8 @@ static LttvBdevState *bdevstate_copy(LttvBdevState *bds) retval = bdevstate_new(); g_array_insert_vals(retval->mode_stack, 0, bds->mode_stack->data, bds->mode_stack->len); + + return retval; } static void insert_and_copy_bdev_state(gpointer k, gpointer v, gpointer u) @@ -1437,7 +1443,7 @@ static void state_restore(LttvTraceState *self, LttvAttribute *container) type = lttv_attribute_get_by_name(container, LTTV_STATE_RESOURCE_BLKDEVS, &value); g_assert(type == LTTV_POINTER); lttv_state_free_blkdev_hashtable(self->bdev_states); - self->bdev_states = lttv_state_copy_blkdev_hashtable(self->bdev_states); + self->bdev_states = lttv_state_copy_blkdev_hashtable(*(value.v_pointer)); for(i = 0 ; i < nb_tracefile ; i++) { tfcs = @@ -2364,6 +2370,24 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data) return FALSE; } +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; + + GQuark action = g_quark_from_string(ltt_event_get_string(e, thf->f1)); + guint irq = ltt_event_get_long_unsigned(e, thf->f2); + + ts->irq_names[irq] = action; + + return FALSE; +} + + static gboolean bdev_request_issue(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data; @@ -3169,6 +3193,12 @@ void lttv_state_add_event_hooks(LttvTracesetState *self) 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, @@ -3896,6 +3926,7 @@ static void module_init() LTT_EVENT_THREAD_BRAND = g_quark_from_string("thread_brand"); LTT_EVENT_REQUEST_ISSUE = g_quark_from_string("_blk_request_issue"); LTT_EVENT_REQUEST_COMPLETE = g_quark_from_string("_blk_request_complete"); + LTT_EVENT_LIST_INTERRUPT = g_quark_from_string("interrupt");; LTT_FIELD_SYSCALL_ID = g_quark_from_string("syscall_id"); @@ -3921,6 +3952,8 @@ static void module_init() LTT_FIELD_MAJOR = g_quark_from_string("major"); 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");