+ GtkTreeIter iter;
+ int i, j;
+ GtkTreeModel *model = GTK_TREE_MODEL(Event_Viewer_Data->Store_M);
+ GtkTreePath *Tree_Path;
+ gchar *test_string;
+ RawTraceData * raw_data;
+ GPtrArray * second_data;
+ TimePeriod * time_period;
+
+ // if(Event_Number > Event_Viewer_Data->Last_Event ||
+ // Event_Number + List_Height-1 < Event_Viewer_Data->First_Event ||
+ // Event_Viewer_Data->First_Event == -1)
+ {
+ /* no event can be reused, clear and start from nothing */
+ second_data = Event_Viewer_Data->raw_trace_data == Event_Viewer_Data->raw_trace_data_first
+ ? Event_Viewer_Data->raw_trace_data_second : Event_Viewer_Data->raw_trace_data_first;
+
+ //scroll up
+ if(Event_Number < Event_Viewer_Data->start_event_number){
+ Event_Viewer_Data->current_period--;
+ Event_Viewer_Data->end_event_number -= second_data->len;
+ g_ptr_array_free(second_data, TRUE);
+ if(Event_Viewer_Data->raw_trace_data == Event_Viewer_Data->raw_trace_data_first){
+ Event_Viewer_Data->raw_trace_data_second = g_ptr_array_sized_new(RESERVE_SIZE);
+ Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_second;
+ }else{
+ Event_Viewer_Data->raw_trace_data_first = g_ptr_array_sized_new(RESERVE_SIZE);
+ Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first;
+ }
+ time_period = g_ptr_array_index(Event_Viewer_Data->time_period,
+ Event_Viewer_Data->current_period);
+ get_events(Event_Viewer_Data, time_period->start, time_period->end);
+ raw_data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,
+ Event_Viewer_Data->raw_trace_data->len-1);
+ Event_Viewer_Data->start_event_number -= Event_Viewer_Data->raw_trace_data->len;
+
+ }
+ //scroll down
+ else if(Event_Number+List_Height >= Event_Viewer_Data->end_event_number){
+ Event_Viewer_Data->current_period++;
+ Event_Viewer_Data->start_event_number += Event_Viewer_Data->raw_trace_data->len;
+ g_ptr_array_free(Event_Viewer_Data->raw_trace_data, TRUE);
+ if(second_data == Event_Viewer_Data->raw_trace_data_first){
+ Event_Viewer_Data->raw_trace_data_second = g_ptr_array_sized_new(RESERVE_SIZE);
+ Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_second;
+ }else{
+ Event_Viewer_Data->raw_trace_data_first = g_ptr_array_sized_new(RESERVE_SIZE);
+ Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first;
+ }
+
+ if(Event_Viewer_Data->current_period+1 == Event_Viewer_Data->time_period->len){
+ time_period = g_new(TimePeriod, 1);
+ raw_data = g_ptr_array_index(second_data,second_data->len-1);
+ time_period->start = raw_data->time;
+ time_period->start.tv_nsec++;
+ time_period->end.tv_sec = time_period->start.tv_sec + SECOND_INTERVAL;
+ time_period->end.tv_nsec = time_period->start.tv_nsec + NANOSECOND_INTERVAL;
+ g_ptr_array_add(Event_Viewer_Data->time_period,time_period);
+ }
+
+ time_period = g_ptr_array_index(Event_Viewer_Data->time_period,
+ Event_Viewer_Data->current_period+1);
+
+ get_events(Event_Viewer_Data,time_period->start, time_period->end);
+ raw_data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,0);
+ time_period->start = raw_data->time;
+ raw_data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,
+ Event_Viewer_Data->raw_trace_data->len-1);
+ time_period->end = raw_data->time;
+ Event_Viewer_Data->end_event_number += Event_Viewer_Data->raw_trace_data->len;
+ Event_Viewer_Data->raw_trace_data = second_data;
+
+ if(Event_Viewer_Data->end_event_number > Event_Viewer_Data->Number_Of_Events){
+ Event_Viewer_Data->Number_Of_Events = Event_Viewer_Data->end_event_number;
+ Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events + 1;
+ }
+ }
+
+ second_data = Event_Viewer_Data->raw_trace_data == Event_Viewer_Data->raw_trace_data_first
+ ? Event_Viewer_Data->raw_trace_data_second : Event_Viewer_Data->raw_trace_data_first;
+
+ gtk_list_store_clear(Event_Viewer_Data->Store_M);
+ for(i=Event_Number; i<Event_Number+List_Height; i++)
+ {
+ if(i>=Event_Viewer_Data->Number_Of_Events) break;
+
+ j = i - Event_Viewer_Data->start_event_number;
+
+ if(j < Event_Viewer_Data->raw_trace_data->len)
+ raw_data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data, j);
+ else
+ raw_data = g_ptr_array_index(second_data, j - Event_Viewer_Data->raw_trace_data->len);
+
+ /* Add a new row to the model */
+ gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
+ gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+ CPUID_COLUMN, raw_data->cpu_id,
+ EVENT_COLUMN, raw_data->event_name,
+ TIME_COLUMN, raw_data->time.tv_sec*1000000000 + raw_data->time.tv_nsec,
+ PID_COLUMN, raw_data->pid,
+ ENTRY_LEN_COLUMN, raw_data->entry_length,
+ EVENT_DESCR_COLUMN, raw_data->event_description,
+ -1);
+/*
+ gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
+ CPUID_COLUMN, 0,
+ EVENT_COLUMN, "event irq",
+ TIME_COLUMN, i,
+ PID_COLUMN, 100,
+ ENTRY_LEN_COLUMN, 17,
+ EVENT_DESCR_COLUMN, "Detailed information",
+ -1);
+*/
+ }
+ }
+#ifdef DEBUG //do not use this, it's slower and broken
+ // } else {
+ /* Some events will be reused */
+ if(Event_Number < Event_Viewer_Data->First_Event)
+ {
+ /* scrolling up, prepend events */
+ Tree_Path = gtk_tree_path_new_from_indices
+ (Event_Number+List_Height-1 -
+ Event_Viewer_Data->First_Event + 1,
+ -1);
+ for(i=0; i<Event_Viewer_Data->Last_Event-(Event_Number+List_Height-1);
+ i++)