X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiEvents.c;h=89c36e5444f6eb87c7a51f4ba32a54c0a0b505cf;hb=e4eced0fb7cd23ba2b16eff08f2185bed49ab5e5;hp=bb1815bd89eed26c53776a7c0d8b5dd9562d114f;hpb=675f8f58941dc3ab0cd78625f45f4b73b7eb9320;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiEvents.c b/ltt/branches/poly/lttv/modules/guiEvents.c index bb1815bd..89c36e54 100644 --- a/ltt/branches/poly/lttv/modules/guiEvents.c +++ b/ltt/branches/poly/lttv/modules/guiEvents.c @@ -57,6 +57,7 @@ static GSList *sEvent_Viewer_Data_List = NULL ; /** hook functions for update time interval, current time ... */ gboolean updateTimeInterval(void * hook_data, void * call_data); gboolean updateCurrentTime(void * hook_data, void * call_data); +void free_ptr_array(GPtrArray * raw_tarce_data); typedef struct _RawTraceData{ unsigned cpu_id; @@ -70,11 +71,19 @@ typedef struct _RawTraceData{ typedef struct _TimePeriod{ LttTime start; LttTime end; + unsigned start_event_number; + unsigned end_event_number; } TimePeriod; #define RESERVE_SIZE 1000 -#define SECOND_INTERVAL 1 -#define NANOSECOND_INTERVAL 1000 + +typedef enum _ScrollDirection{ + SCROLL_IN_SAME_PERIOD, + SCROLL_UP_ONE_PERIOD, + SCROLL_UP_MORE_PERIOD, + SCROLL_DOWN_ONE_PERIOD, + SCROLL_DOWN_MORE_PERIOD +} ScrollDirection; typedef struct _EventViewerData { @@ -90,6 +99,9 @@ typedef struct _EventViewerData { unsigned end_event_number; LttvHooks * before_event_hooks; + //scroll window containing Tree View + GtkWidget * Scroll_Win; + /* Model containing list data */ GtkListStore *Store_M; @@ -139,11 +151,12 @@ static void Tree_V_grab_focus(GtkWidget *widget, gpointer data); static void get_test_data(guint Event_Number, guint List_Height, - EventViewerData *Event_Viewer_Data); + EventViewerData *Event_Viewer_Data); void add_test_data(EventViewerData *Event_Viewer_Data); -static void get_events(EventViewerData* Event_Viewer_Data, LttTime start, LttTime end); +static void get_events(EventViewerData* Event_Viewer_Data, LttTime start, + LttTime end, unsigned maxNumEvents); static gboolean parse_event(void *hook_data, void *call_data); /** @@ -217,7 +230,9 @@ hGuiEvents(mainWindow * pmParentWindow) { EventViewerData* Event_Viewer_Data = GuiEvents(pmParentWindow) ; - return Event_Viewer_Data->HBox_V ; + if(Event_Viewer_Data) + return Event_Viewer_Data->HBox_V ; + else return NULL; } @@ -250,6 +265,11 @@ GuiEvents(mainWindow *pmParentWindow) RegUpdateTimeInterval(updateTimeInterval,Event_Viewer_Data, Event_Viewer_Data->mw); RegUpdateCurrentTime(updateCurrentTime,Event_Viewer_Data, Event_Viewer_Data->mw); + Event_Viewer_Data->Scroll_Win = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_show ( Event_Viewer_Data->Scroll_Win); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(Event_Viewer_Data->Scroll_Win), + GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); + /* TEST DATA, TO BE READ FROM THE TRACE */ Event_Viewer_Data->Number_Of_Events = RESERVE_SIZE ; Event_Viewer_Data->Currently_Selected_Event = FALSE ; @@ -259,7 +279,7 @@ GuiEvents(mainWindow *pmParentWindow) Event_Viewer_Data->Store_M = gtk_list_store_new (N_COLUMNS, /* Total number of columns */ G_TYPE_INT, /* CPUID */ G_TYPE_STRING, /* Event */ - G_TYPE_INT, /* Time */ + G_TYPE_UINT64, /* Time */ G_TYPE_INT, /* PID */ G_TYPE_INT, /* Entry length */ G_TYPE_STRING); /* Event's description */ @@ -358,8 +378,10 @@ GuiEvents(mainWindow *pmParentWindow) G_CALLBACK (tree_selection_changed_cb), Event_Viewer_Data); + gtk_container_add (GTK_CONTAINER (Event_Viewer_Data->Scroll_Win), Event_Viewer_Data->Tree_V); + Event_Viewer_Data->HBox_V = gtk_hbox_new(0, 0); - gtk_box_pack_start(GTK_BOX(Event_Viewer_Data->HBox_V), Event_Viewer_Data->Tree_V, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(Event_Viewer_Data->HBox_V), Event_Viewer_Data->Scroll_Win, TRUE, TRUE, 0); /* Create vertical scrollbar and pack it */ Event_Viewer_Data->VScroll_VC = gtk_vscrollbar_new(NULL); @@ -398,12 +420,14 @@ GuiEvents(mainWindow *pmParentWindow) start.tv_sec = 0; start.tv_nsec = 0; - end.tv_sec = SECOND_INTERVAL; - end.tv_nsec = NANOSECOND_INTERVAL; + end.tv_sec = G_MAXULONG; + end.tv_nsec = G_MAXULONG; Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first; - get_events(Event_Viewer_Data, start,end); + get_events(Event_Viewer_Data, start,end, RESERVE_SIZE); Event_Viewer_Data->Number_Of_Events = Event_Viewer_Data->raw_trace_data->len; + + if(Event_Viewer_Data->raw_trace_data->len == 0) return NULL; time_period = g_new(TimePeriod, 1); data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,0); @@ -411,6 +435,8 @@ GuiEvents(mainWindow *pmParentWindow) data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data, Event_Viewer_Data->raw_trace_data->len-1); time_period->end = data->time; + time_period->start_event_number = 0; + time_period->end_event_number = Event_Viewer_Data->raw_trace_data->len - 1; g_ptr_array_add(Event_Viewer_Data->time_period, time_period); start = data->time; @@ -418,7 +444,7 @@ GuiEvents(mainWindow *pmParentWindow) Event_Viewer_Data->current_period = 0; Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_second; - get_events(Event_Viewer_Data, start,end); + get_events(Event_Viewer_Data, start,end, RESERVE_SIZE); Event_Viewer_Data->Number_Of_Events += Event_Viewer_Data->raw_trace_data->len; time_period = g_new(TimePeriod, 1); @@ -427,14 +453,17 @@ GuiEvents(mainWindow *pmParentWindow) data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data, Event_Viewer_Data->raw_trace_data->len-1); time_period->end = data->time; + time_period->start_event_number = Event_Viewer_Data->Number_Of_Events + - Event_Viewer_Data->raw_trace_data->len; + time_period->end_event_number = Event_Viewer_Data->Number_Of_Events - 1; g_ptr_array_add(Event_Viewer_Data->time_period, time_period); Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first; Event_Viewer_Data->start_event_number = 0; - Event_Viewer_Data->end_event_number = Event_Viewer_Data->Number_Of_Events; + Event_Viewer_Data->end_event_number = Event_Viewer_Data->Number_Of_Events - 1; - Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events + 1; + Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events; // Test data get_test_data((int)Event_Viewer_Data->VAdjust_C->value, @@ -649,7 +678,7 @@ void Tree_V_cursor_changed_cb (GtkWidget *widget, gpointer data) { EventViewerData *Event_Viewer_Data = (EventViewerData*) data; LttTime ltt_time; - unsigned long time; + guint64 time; GtkTreeIter iter; GtkTreeModel* model = GTK_TREE_MODEL(Event_Viewer_Data->Store_M); GtkTreePath *path; @@ -778,7 +807,11 @@ void get_test_data(guint Event_Number, guint List_Height, gchar *test_string; RawTraceData * raw_data; GPtrArray * second_data; - TimePeriod * time_period; + TimePeriod * time_period, *time_period1; + unsigned scroll_period; + ScrollDirection direction = SCROLL_IN_SAME_PERIOD; + int period_diff; + gboolean new_time_period = FALSE; // if(Event_Number > Event_Viewer_Data->Last_Event || // Event_Number + List_Height-1 < Event_Viewer_Data->First_Event || @@ -787,65 +820,153 @@ void get_test_data(guint Event_Number, guint List_Height, /* 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; + + // get the right time period + for(i=0;itime_period->len;i++){ + time_period = g_ptr_array_index(Event_Viewer_Data->time_period, i); + scroll_period = i; + if(Event_Number > time_period->end_event_number)continue; + if(Event_Number + List_Height <= time_period->end_event_number){ + if(Event_Viewer_Data->current_period == scroll_period -1){ + scroll_period--; + } + } + break; + } + + period_diff = scroll_period - Event_Viewer_Data->current_period; + if(period_diff == 0) direction = SCROLL_IN_SAME_PERIOD; + else if(period_diff == -1) direction = SCROLL_UP_ONE_PERIOD; + else if(period_diff < -1) direction = SCROLL_UP_MORE_PERIOD; + else if(period_diff == 1) direction = SCROLL_DOWN_ONE_PERIOD; + else if(period_diff > 1) direction = SCROLL_DOWN_MORE_PERIOD; + Event_Viewer_Data->current_period += period_diff; //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){ + if(Event_Number < Event_Viewer_Data->start_event_number){ + if(direction == SCROLL_UP_ONE_PERIOD){ + // Event_Viewer_Data->current_period--; + Event_Viewer_Data->end_event_number -= second_data->len; + free_ptr_array(second_data); + 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,RESERVE_SIZE); + 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; + }else{//direction = SCROLL_UP_MORE_PERIOD + free_ptr_array(second_data); + free_ptr_array(Event_Viewer_Data->raw_trace_data); + Event_Viewer_Data->raw_trace_data_first = g_ptr_array_sized_new(RESERVE_SIZE); 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; + 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,RESERVE_SIZE); + Event_Viewer_Data->start_event_number = time_period->start_event_number; + Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_second; + 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,RESERVE_SIZE); + Event_Viewer_Data->end_event_number = time_period->end_event_number; + + Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first; + } } //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){ + if(direction == SCROLL_DOWN_ONE_PERIOD){ + //Event_Viewer_Data->current_period++; + Event_Viewer_Data->start_event_number += Event_Viewer_Data->raw_trace_data->len; + free_ptr_array(Event_Viewer_Data->raw_trace_data); + 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){ + new_time_period = TRUE; + 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 = G_MAXULONG; + time_period->end.tv_nsec = G_MAXULONG; + time_period->start_event_number = Event_Viewer_Data->end_event_number + 1; + 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, RESERVE_SIZE); + Event_Viewer_Data->end_event_number += Event_Viewer_Data->raw_trace_data->len; + if(new_time_period){ + 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; + time_period->end_event_number = Event_Viewer_Data->end_event_number; + } + 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; + } + }else{//direction = SCROLL_DOWN_MORE_PERIOD + free_ptr_array(second_data); + free_ptr_array(Event_Viewer_Data->raw_trace_data); + Event_Viewer_Data->raw_trace_data_first = g_ptr_array_sized_new(RESERVE_SIZE); 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){ + new_time_period = TRUE; + time_period = g_new(TimePeriod, 1); + time_period1 = g_ptr_array_index(Event_Viewer_Data->time_period, + Event_Viewer_Data->time_period->len-1); + time_period->start = time_period1->end; + time_period->start.tv_nsec++; + time_period->end.tv_sec = G_MAXULONG; + time_period->end.tv_nsec = G_MAXULONG; + time_period->start_event_number = time_period1->end_event_number + 1; + g_ptr_array_add(Event_Viewer_Data->time_period,time_period); + } - 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); - } + 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, RESERVE_SIZE); + Event_Viewer_Data->start_event_number = time_period->start_event_number; + Event_Viewer_Data->end_event_number = time_period->end_event_number; - 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; + Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_second; + 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, RESERVE_SIZE); + Event_Viewer_Data->end_event_number += Event_Viewer_Data->raw_trace_data->len; + if(new_time_period){ + 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; + time_period->end_event_number = Event_Viewer_Data->end_event_number; + } + Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first; } } @@ -855,6 +976,8 @@ void get_test_data(guint Event_Number, guint List_Height, gtk_list_store_clear(Event_Viewer_Data->Store_M); for(i=Event_Number; i=Event_Viewer_Data->Number_Of_Events) break; j = i - Event_Viewer_Data->start_event_number; @@ -865,11 +988,14 @@ void get_test_data(guint Event_Number, guint List_Height, raw_data = g_ptr_array_index(second_data, j - Event_Viewer_Data->raw_trace_data->len); /* Add a new row to the model */ + real_data = raw_data->time.tv_sec; + real_data *= 1000000000; + real_data += raw_data->time.tv_nsec; 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, + TIME_COLUMN, real_data, PID_COLUMN, raw_data->pid, ENTRY_LEN_COLUMN, raw_data->entry_length, EVENT_DESCR_COLUMN, raw_data->event_description, @@ -1074,11 +1200,12 @@ void Tree_V_grab_focus(GtkWidget *widget, gpointer data){ SetFocusedPane(mw, gtk_widget_get_parent(Event_Viewer_Data->HBox_V)); } -void get_events(EventViewerData* Event_Viewer_Data, LttTime start, LttTime end) +void get_events(EventViewerData* Event_Viewer_Data, LttTime start, + LttTime end,unsigned maxNumEvents) { contextAddHooks(Event_Viewer_Data->mw, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,Event_Viewer_Data->before_event_hooks,NULL); - processTraceset(Event_Viewer_Data->mw, start, end); + processTraceset(Event_Viewer_Data->mw, start, end, maxNumEvents); contextRemoveHooks(Event_Viewer_Data->mw, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,Event_Viewer_Data->before_event_hooks,NULL); @@ -1220,6 +1347,18 @@ gboolean parse_event(void *hook_data, void *call_data) return FALSE; } +void free_ptr_array(GPtrArray* raw_trace_data) +{ + RawTraceData* data; + int i; + for(i=0;ilen;i++){ + data = g_ptr_array_index(raw_trace_data, i); + g_free(data->event_name); + g_free(data->event_description); + g_free(data); + } + g_ptr_array_free(raw_trace_data, TRUE); +}