+ /* Events processing algorithm implementation */
+ /* A. Servicing loop */
+ while( (g_slist_length(list_in) != 0 || g_slist_length(list_out) != 0)) {
+ /* && !gtk_events_pending() ) */
+
+ /* 1. If list_in is empty (need a seek) */
+ if( g_slist_length(list_in) == 0 ) {
+
+ /* list in is empty, need a seek */
+ {
+ /* 1.1 Add requests to list_in */
+ GSList *ltime = NULL;
+ GSList *lpos = NULL;
+ GSList *iter = NULL;
+
+ /* 1.1.1 Find all time requests with the lowest start time in list_out
+ * (ltime)
+ */
+ if(g_slist_length(list_out) > 0)
+ ltime = g_slist_append(ltime, g_slist_nth_data(list_out, 0));
+ for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
+ /* Find all time requests with the lowest start time in list_out */
+ guint index_ltime = g_array_index(ltime, guint, 0);
+ EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
+ EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
+
+ int comp;
+ comp = ltt_time_compare(event_request_ltime->start_time,
+ event_request_list_out->start_time);
+ if(comp == 0)
+ ltime = g_slist_append(ltime, event_request_list_out);
+ else if(comp > 0) {
+ /* Remove all elements from ltime, and add current */
+ while(ltime != NULL)
+ ltime = g_slist_delete_link(ltime, g_slist_nth(ltime, 0));
+ ltime = g_slist_append(ltime, event_request_list_out);
+ }
+ }
+
+ /* 1.1.2 Find all position requests with the lowest position in list_out
+ * (lpos)
+ */
+ if(g_slist_length(list_out) > 0)
+ lpos = g_slist_append(lpos, g_slist_nth_data(list_out, 0));
+ for(iter=g_slist_nth(list_out,1);iter!=NULL;iter=g_slist_next(iter)) {
+ /* Find all position requests with the lowest position in list_out */
+ guint index_lpos = g_array_index(lpos, guint, 0);
+ EventsRequest *event_request_lpos = (EventsRequest*)g_slist_nth_data(lpos, 0);
+ EventsRequest *event_request_list_out = (EventsRequest*)iter->data;
+
+ int comp;
+ if(event_request_lpos->start_position != NULL
+ && event_request_list_out->start_position != NULL)
+ {
+ comp = lttv_traceset_context_pos_pos_compare
+ (event_request_lpos->start_position,
+ event_request_list_out->start_position);
+ } else {
+ comp = -1;
+ }
+ if(comp == 0)
+ lpos = g_slist_append(lpos, event_request_list_out);
+ else if(comp > 0) {
+ /* Remove all elements from lpos, and add current */
+ while(lpos != NULL)
+ lpos = g_slist_delete_link(lpos, g_slist_nth(lpos, 0));
+ lpos = g_slist_append(lpos, event_request_list_out);
+ }
+ }
+
+ /* 1.1.3 If lpos.start time < ltime */
+ {
+ EventsRequest *event_request_lpos = (EventsRequest*)g_slist_nth_data(lpos, 0);
+ EventsRequest *event_request_ltime = (EventsRequest*)g_slist_nth_data(ltime, 0);
+ LttTime lpos_start_time;
+
+ if(event_request_lpos != NULL
+ && event_request_lpos->start_position != NULL) {
+
+ lpos_start_time = lttv_traceset_context_position_get_time(
+ event_request_lpos->start_position);
+ if(ltt_time_compare(lpos_start_time,
+ event_request_ltime->start_time)<0) {
+ /* Add lpos to list_in, remove them from list_out */
+
+ for(iter=lpos;iter!=NULL;iter=g_slist_next(iter)) {
+ /* Add to list_in */
+ EventsRequest *event_request_lpos =
+ (EventsRequest*)iter->data;
+
+ list_in = g_slist_append(list_in, event_request_lpos);
+ /* Remove from list_out */
+ list_out = g_slist_remove(list_out, event_request_lpos);
+ }
+ }
+ } else {
+ /* 1.1.4 (lpos.start time >= ltime) */
+ /* Add ltime to list_in, remove them from list_out */
+
+ for(iter=ltime;iter!=NULL;iter=g_slist_next(iter)) {
+ /* Add to list_in */
+ EventsRequest *event_request_ltime =
+ (EventsRequest*)iter->data;
+
+ list_in = g_slist_append(list_in, event_request_ltime);
+ /* Remove from list_out */
+ list_out = g_slist_remove(list_out, event_request_ltime);
+ }
+ }
+ }
+ g_slist_free(lpos);
+ g_slist_free(ltime);
+ }
+
+ /* 1.2 Seek */
+ {
+ tfc = lttv_traceset_context_get_current_tfc(tsc);
+ g_assert(g_slist_length(list_in)>0);
+ EventsRequest *events_request = g_slist_nth_data(list_in, 0);
+ guint seek_count;
+
+ /* 1.2.1 If first request in list_in is a time request */
+ if(events_request->start_position == NULL) {
+ /* - If first req in list_in start time != current time */
+ if(tfc == NULL || ltt_time_compare(events_request->start_time,
+ tfc->timestamp) != 0)
+ /* - Seek to that time */
+ g_debug("SEEK TIME : %lu, %lu", events_request->start_time.tv_sec,
+ events_request->start_time.tv_nsec);
+ //lttv_process_traceset_seek_time(tsc, events_request->start_time);
+ lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
+ events_request->start_time);
+
+ /* Process the traceset with only state hooks */
+ seek_count =
+ lttv_process_traceset_middle(tsc,
+ events_request->start_time,
+ G_MAXUINT, NULL);
+
+
+ } else {
+ LttTime pos_time;
+ /* Else, the first request in list_in is a position request */
+ /* If first req in list_in pos != current pos */
+ g_assert(events_request->start_position != NULL);
+ if(lttv_traceset_context_ctx_pos_compare(tsc,
+ events_request->start_position) != 0) {
+ /* 1.2.2.1 Seek to that position */
+ g_debug("SEEK POSITION");
+ //lttv_process_traceset_seek_position(tsc, events_request->start_position);
+ pos_time = lttv_traceset_context_position_get_time(events_request->start_position);
+
+ lttv_state_traceset_seek_time_closest(LTTV_TRACESET_STATE(tsc),
+ pos_time);
+
+ /* Process the traceset with only state hooks */
+ seek_count =
+ lttv_process_traceset_middle(tsc,
+ ltt_time_infinite,
+ G_MAXUINT,
+ events_request->start_position);
+
+
+ }
+ }
+ }
+
+ /* 1.3 Add hooks and call before request for all list_in members */
+ {
+ GSList *iter = NULL;
+
+ for(iter=list_in;iter!=NULL;iter=g_slist_next(iter)) {
+ EventsRequest *events_request = (EventsRequest*)iter->data;
+ /* 1.3.1 If !servicing */
+ if(events_request->servicing == FALSE) {
+ /* - begin request hooks called
+ * - servicing = TRUE
+ */
+ lttv_hooks_call(events_request->before_request, (gpointer)tsc);
+ events_request->servicing = TRUE;
+ }
+ /* 1.3.2 call before chunk
+ * 1.3.3 events hooks added
+ */
+ lttv_process_traceset_begin(tsc, events_request->before_chunk_traceset,
+ events_request->before_chunk_trace,
+ events_request->before_chunk_tracefile,
+ events_request->event,
+ events_request->event_by_id);
+ }
+ }
+ } else {
+ /* 2. Else, list_in is not empty, we continue a read */
+
+ {
+ /* 2.0 For each req of list_in */
+ GSList *iter = list_in;