+/* Action to do when background computation completed.
+ *
+ * Eventually, will have to check that every requested traces are finished
+ * before doing the redraw.
+ */
+
+gint background_ready(void *hook_data, void *call_data)
+{
+ ControlFlowData *control_flow_data = (ControlFlowData *)hook_data;
+ LttvTrace *trace = (LttvTrace*)call_data;
+
+ g_debug("control flow viewer : background computation data ready.");
+
+ redraw_notify(control_flow_data, NULL);
+
+ return 0;
+}
+
+
+/* Request background computation. Verify if it is in progress or ready first.
+ *
+ * Right now, for all loaded traces.
+ *
+ * Later : must be only for each trace in the tab's traceset.
+ */
+void request_background_data(ControlFlowData *control_flow_data)
+{
+ gint num_traces = lttvwindowtraces_get_number();
+ gint i;
+ LttvTrace *trace;
+
+ LttvHooks *background_ready_hook =
+ lttv_hooks_new();
+ lttv_hooks_add(background_ready_hook, background_ready, control_flow_data,
+ LTTV_PRIO_DEFAULT);
+
+ for(i=0;i<num_traces;i++) {
+ trace = lttvwindowtraces_get_trace(i);
+
+ if(lttvwindowtraces_get_ready(g_quark_from_string("state"),trace)==FALSE) {
+
+ if(lttvwindowtraces_get_in_progress(g_quark_from_string("state"),
+ trace) == FALSE) {
+ /* We first remove requests that could have been done for the same
+ * information. Happens when two viewers ask for it before servicing
+ * starts.
+ */
+ lttvwindowtraces_background_request_remove(trace, "state");
+ lttvwindowtraces_background_request_queue(trace,
+ "state");
+ lttvwindowtraces_background_notify_queue(control_flow_data,
+ trace,
+ ltt_time_infinite,
+ NULL,
+ background_ready_hook);
+ } else { /* in progress */
+
+ lttvwindowtraces_background_notify_current(control_flow_data,
+ trace,
+ ltt_time_infinite,
+ NULL,
+ background_ready_hook);
+
+ }
+ }
+ }
+
+ lttv_hooks_destroy(background_ready_hook);
+}
+
+
+
+