+static void lttvwindow_add_trace(Tab *tab, LttvTrace *trace_v)
+{
+ LttvTraceset *traceset = tab->traceset_info->traceset;
+ guint i;
+
+ //Verify if trace is already present.
+ for(i=0; i<lttv_traceset_number(traceset); i++)
+ {
+ LttvTrace * trace = lttv_traceset_get(traceset, i);
+ if(trace == trace_v)
+ return;
+ }
+
+ //Keep a reference to the traces so they are not freed.
+ for(i=0; i<lttv_traceset_number(traceset); i++)
+ {
+ LttvTrace * trace = lttv_traceset_get(traceset, i);
+ lttv_trace_ref(trace);
+ }
+
+ //remove state update hooks
+ lttv_state_remove_event_hooks(
+ (LttvTracesetState*)tab->traceset_info->traceset_context);
+
+ lttv_context_fini(LTTV_TRACESET_CONTEXT(
+ tab->traceset_info->traceset_context));
+ g_object_unref(tab->traceset_info->traceset_context);
+
+ lttv_traceset_add(traceset, trace_v);
+ lttv_trace_ref(trace_v); /* local ref */
+
+ /* Create new context */
+ tab->traceset_info->traceset_context =
+ g_object_new(LTTV_TRACESET_STATS_TYPE, NULL);
+ lttv_context_init(
+ LTTV_TRACESET_CONTEXT(tab->traceset_info->
+ traceset_context),
+ traceset);
+
+ /* Set the tab's time window and current time if currently 0, 0 */
+ if(tab->time_window.start_time.tv_sec == 0 &&
+ tab->time_window.start_time.tv_nsec == 0)
+ tab->time_window.start_time =
+ LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
+ time_span.start_time;
+ if(tab->time_window.time_width.tv_sec == 0 &&
+ tab->time_window.time_width.tv_nsec == 0) {
+ LttTime tmp_time;
+
+ if(DEFAULT_TIME_WIDTH_S <
+ LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
+ time_span.end_time.tv_sec)
+ tmp_time.tv_sec = DEFAULT_TIME_WIDTH_S;
+ else
+ tmp_time.tv_sec =
+ LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
+ time_span.end_time.tv_sec;
+ tmp_time.tv_nsec = 0;
+ tab->time_window.time_width = tmp_time ;
+ }
+ if(tab->current_time.tv_sec == 0 && tab->current_time.tv_nsec == 0) {
+ tab->current_time.tv_sec =
+ LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
+ time_span.start_time.tv_sec;
+ tab->current_time.tv_nsec =
+ LTTV_TRACESET_CONTEXT(tab->traceset_info->traceset_context)->
+ time_span.start_time.tv_nsec;
+ }
+
+
+ //add state update hooks
+ lttv_state_add_event_hooks(
+ (LttvTracesetState*)tab->traceset_info->traceset_context);
+ //Remove local reference to the traces.
+ for(i=0; i<lttv_traceset_number(traceset); i++)
+ {
+ LttvTrace * trace = lttv_traceset_get(traceset, i);
+ lttv_trace_unref(trace);
+ }
+
+ add_trace_into_traceset_selector(tab->multi_vpaned, lttv_trace(trace_v));
+}
+