X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Flttv%2Fstate.c;h=bc4884ca6e19950cb8711ef647070bb0397909e7;hb=44c0619eb20fb7e34b3ec088219fe6d3c05cec75;hp=58ae0a2f65e089eaf26808d90fceafb9810b00e5;hpb=fc6a87b233ef7a987817ab50aeec1342f5aee16f;p=lttv.git diff --git a/ltt/branches/poly/lttv/lttv/state.c b/ltt/branches/poly/lttv/lttv/state.c index 58ae0a2f..bc4884ca 100644 --- a/ltt/branches/poly/lttv/lttv/state.c +++ b/ltt/branches/poly/lttv/lttv/state.c @@ -185,6 +185,11 @@ static void lttv_state_free_process_table(GHashTable *processes); static void lttv_trace_states_read_raw(LttvTraceState *tcs, FILE *fp, GPtrArray *quarktable); +/* Resource function prototypes */ +static void bdev_state_free(gpointer key, gpointer value, gpointer user_data); +static LttvBdevState *bdev_state_get(LttvTraceState *ts, guint16 devcode); + + void lttv_state_save(LttvTraceState *self, LttvAttribute *container) { LTTV_TRACE_STATE_GET_CLASS(self)->state_save(self, container); @@ -298,6 +303,9 @@ restore_init_state(LttvTraceState *self) if(self->irq_states[i].mode_stack->len > 0) g_array_remove_range(self->irq_states[i].mode_stack, 0, self->irq_states[i].mode_stack->len); } + + g_hash_table_foreach(self->bdev_states, bdev_state_free, NULL); + g_hash_table_steal_all(self->bdev_states); #if 0 nb_tracefile = self->parent.tracefiles->len; @@ -1736,7 +1744,7 @@ static void cpu_push_mode(LttvCPUState *cpust, LttvCPUMode state) static void cpu_pop_mode(LttvCPUState *cpust) { - if(cpust->mode_stack->len == 1) + if(cpust->mode_stack->len <= 1) cpu_set_base_mode(cpust, LTTV_CPU_UNKNOWN); else g_array_set_size(cpust->mode_stack, cpust->mode_stack->len - 1); @@ -1757,7 +1765,7 @@ static void bdev_push_mode(LttvBdevState *bdevst, LttvBdevMode state) static void bdev_pop_mode(LttvBdevState *bdevst) { - if(bdevst->mode_stack->len == 1) + if(bdevst->mode_stack->len <= 1) bdev_set_base_mode(bdevst, LTTV_BDEV_UNKNOWN); else g_array_set_size(bdevst->mode_stack, bdevst->mode_stack->len - 1); @@ -1777,7 +1785,7 @@ static void irq_push_mode(LttvIRQState *irqst, LttvIRQMode state) static void irq_pop_mode(LttvIRQState *irqst) { - if(irqst->mode_stack->len == 1) + if(irqst->mode_stack->len <= 1) irq_set_base_mode(irqst, LTTV_IRQ_UNKNOWN); else g_array_set_size(irqst->mode_stack, irqst->mode_stack->len - 1); @@ -2259,7 +2267,7 @@ static gboolean soft_irq_entry(void *hook_data, void *call_data) return FALSE; } -LttvBdevState *bdev_state_get(LttvTraceState *ts, guint16 devcode) +static LttvBdevState *bdev_state_get(LttvTraceState *ts, guint16 devcode) { gint devcode_gint = devcode; gpointer bdev = g_hash_table_lookup(ts->bdev_states, &devcode_gint); @@ -2278,6 +2286,14 @@ LttvBdevState *bdev_state_get(LttvTraceState *ts, guint16 devcode) return bdev; } +static void bdev_state_free(gpointer key, gpointer value, gpointer user_data) +{ + LttvBdevState *bds = (LttvBdevState *) value; + + g_array_free(bds->mode_stack, FALSE); + g_free(bds); +} + static gboolean bdev_request_issue(void *hook_data, void *call_data) { LttvTracefileState *s = (LttvTracefileState *)call_data;