static GSList *sEvent_Viewer_Data_List = NULL ;
/** hook functions for update time interval, current time ... */
-gboolean updateTimeInterval(void * hook_data, void * call_data);
+gboolean updateTimeWindow(void * hook_data, void * call_data);
gboolean updateCurrentTime(void * hook_data, void * call_data);
+void remove_item_from_queue(GQueue * q, gboolean fromHead);
+void remove_all_items_from_queue(GQueue * q);
typedef struct _RawTraceData{
unsigned cpu_id;
int pid;
unsigned entry_length;
char * event_description;
+ LttEventPosition ep;
} RawTraceData;
-typedef struct _TimePeriod{
- LttTime start;
- LttTime end;
-} TimePeriod;
+#define RESERVE_BIG_SIZE 1000
+#define RESERVE_SMALL_SIZE 100
-#define RESERVE_SIZE 1000
-#define SECOND_INTERVAL 1
-#define NANOSECOND_INTERVAL 1000
+typedef enum _ScrollDirection{
+ SCROLL_STEP_UP,
+ SCROLL_STEP_DOWN,
+ SCROLL_PAGE_UP,
+ SCROLL_PAGE_DOWN,
+ SCROLL_JUMP,
+ SCROLL_NONE
+} ScrollDirection;
typedef struct _EventViewerData {
mainWindow * mw;
- TimeInterval time_interval;
+ TimeWindow time_window;
LttTime current_time;
- GPtrArray * raw_trace_data;
- GPtrArray * raw_trace_data_first;
- GPtrArray * raw_trace_data_second;
- GPtrArray * time_period;
- unsigned current_period;
- unsigned start_event_number;
- unsigned end_event_number;
LttvHooks * before_event_hooks;
+ gboolean append; //prepend or append item
+ GQueue * raw_trace_data_queue; //buf to contain raw trace data
+ GQueue * raw_trace_data_queue_tmp; //tmp buf to contain raw data
+ unsigned current_event_index;
+ double previous_value; //value of the slide
+ TimeInterval time_span;
+ // LttTime trace_start;
+ // LttTime trace_end;
+ unsigned start_event_index; //the first event shown in the window
+ unsigned end_event_index; //the last event shown in the window
+
+ //scroll window containing Tree View
+ GtkWidget * Scroll_Win;
+
/* Model containing list data */
GtkListStore *Store_M;
EventViewerData *GuiEvents(mainWindow *pmParentWindow);
//! Event Viewer's destructor
void GuiEvents_Destructor(EventViewerData *Event_Viewer_Data);
+void GuiEvents_free(EventViewerData *Event_Viewer_Data);
static int Event_Selected_Hook(void *hook_data, void *call_data);
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);
+static void get_test_data(double time, guint List_Height,
+ 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, unsigned * realNumEvent);
static gboolean parse_event(void *hook_data, void *call_data);
+static LttvModule *Main_Win_Module;
+
/**
* plugin's init function
*
* This function initializes the Event Viewer functionnality through the
* gtkTraceSet API.
*/
-G_MODULE_EXPORT void init() {
+G_MODULE_EXPORT void init(LttvModule *self, int argc, char *argv[]) {
+
+ Main_Win_Module = lttv_module_require(self, "mainwin", argc, argv);
+
+ if(Main_Win_Module == NULL)
+ {
+ g_critical("Can't load Control Flow Viewer : missing mainwin\n");
+ return;
+ }
+
g_critical("GUI Event Viewer init()");
g_critical("GUI Event Viewer destroy()");
g_slist_foreach(sEvent_Viewer_Data_List, destroy_walk, NULL );
-
+
+ g_slist_free(sEvent_Viewer_Data_List);
+
/* Unregister the toolbar insert button */
ToolbarItemUnreg(hGuiEvents);
{
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;
}
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
EventViewerData* Event_Viewer_Data = g_new(EventViewerData,1) ;
- TimePeriod * time_period;
RawTraceData * data;
+ unsigned size;
Event_Viewer_Data->mw = pmParentWindow;
- GetTimeInterval(Event_Viewer_Data->mw, &Event_Viewer_Data->time_interval);
+ GetTimeWindow(Event_Viewer_Data->mw, &Event_Viewer_Data->time_window);
GetCurrentTime(Event_Viewer_Data->mw, &Event_Viewer_Data->current_time);
- 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->time_period = g_ptr_array_sized_new(RESERVE_SIZE);
Event_Viewer_Data->before_event_hooks = lttv_hooks_new();
lttv_hooks_add(Event_Viewer_Data->before_event_hooks, parse_event, Event_Viewer_Data);
- RegUpdateTimeInterval(updateTimeInterval,Event_Viewer_Data, Event_Viewer_Data->mw);
+ Event_Viewer_Data->raw_trace_data_queue = g_queue_new();
+ Event_Viewer_Data->raw_trace_data_queue_tmp = g_queue_new();
+
+ RegUpdateTimeWindow(updateTimeWindow,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 ;
Event_Viewer_Data->Selected_Event = 0;
/* Create a model for storing the data list */
- 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_INT, /* PID */
- G_TYPE_INT, /* Entry length */
- G_TYPE_STRING); /* Event's description */
+ 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_UINT64, /* Time */
+ G_TYPE_INT, /* PID */
+ G_TYPE_INT, /* Entry length */
+ G_TYPE_STRING); /* Event's description */
/* Create the viewer widget for the columned list */
Event_Viewer_Data->Tree_V = gtk_tree_view_new_with_model (GTK_TREE_MODEL (Event_Viewer_Data->Store_M));
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);
G_CALLBACK (v_scroll_cb),
Event_Viewer_Data);
/* Set the upper bound to the last event number */
- Event_Viewer_Data->VAdjust_C->lower = 0;
- Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events;
- Event_Viewer_Data->VAdjust_C->value = 0;
- Event_Viewer_Data->VAdjust_C->step_increment = 1;
- Event_Viewer_Data->VAdjust_C->page_increment =
- Event_Viewer_Data->VTree_Adjust_C->upper;
- Event_Viewer_Data->VAdjust_C->page_size =
- Event_Viewer_Data->VTree_Adjust_C->upper;
+ Event_Viewer_Data->previous_value = 0;
+ Event_Viewer_Data->VAdjust_C->lower = 0.0;
+ //Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events;
+ Event_Viewer_Data->VAdjust_C->value = 0.0;
+ Event_Viewer_Data->VAdjust_C->step_increment = 1.0;
+ Event_Viewer_Data->VAdjust_C->page_increment = 2.0;
+ // Event_Viewer_Data->VTree_Adjust_C->upper;
+ Event_Viewer_Data->VAdjust_C->page_size = 2.0;
+ // Event_Viewer_Data->VTree_Adjust_C->upper;
g_critical("value : %u",Event_Viewer_Data->VTree_Adjust_C->upper);
/* Raw event trace */
gtk_widget_show(Event_Viewer_Data->HBox_V);
Event_Viewer_Data->Num_Visible_Events = 1;
- start.tv_sec = 0;
- start.tv_nsec = 0;
- end.tv_sec = SECOND_INTERVAL;
- end.tv_nsec = NANOSECOND_INTERVAL;
-
- Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first;
- get_events(Event_Viewer_Data, start,end);
- Event_Viewer_Data->Number_Of_Events = Event_Viewer_Data->raw_trace_data->len;
+ //get the life span of the traceset and set the upper of the scroll bar
+ getTracesetTimeSpan(Event_Viewer_Data->mw, &Event_Viewer_Data->time_span);
- time_period = g_new(TimePeriod, 1);
- data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,0);
- time_period->start = data->time;
- data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,
- Event_Viewer_Data->raw_trace_data->len-1);
- time_period->end = data->time;
- g_ptr_array_add(Event_Viewer_Data->time_period, time_period);
-
- start = data->time;
- start.tv_nsec++;
-
- 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);
- Event_Viewer_Data->Number_Of_Events += Event_Viewer_Data->raw_trace_data->len;
+ start = ltt_time_sub(Event_Viewer_Data->time_span.endTime, Event_Viewer_Data->time_span.startTime);
+ Event_Viewer_Data->VAdjust_C->upper = ltt_time_to_double(start) * NANOSECONDS_PER_SECOND;
- time_period = g_new(TimePeriod, 1);
- data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,0);
- time_period->start = data->time;
- data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,
- Event_Viewer_Data->raw_trace_data->len-1);
- time_period->end = data->time;
- g_ptr_array_add(Event_Viewer_Data->time_period, time_period);
+ Event_Viewer_Data->append = TRUE;
- Event_Viewer_Data->raw_trace_data = Event_Viewer_Data->raw_trace_data_first;
+ start.tv_sec = 0;
+ start.tv_nsec = 0;
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
- Event_Viewer_Data->start_event_number = 0;
- Event_Viewer_Data->end_event_number = Event_Viewer_Data->Number_Of_Events;
+ get_events(Event_Viewer_Data, start,end, RESERVE_SMALL_SIZE, &size);
- Event_Viewer_Data->VAdjust_C->upper = Event_Viewer_Data->Number_Of_Events + 1;
+ Event_Viewer_Data->start_event_index = 0;
+ Event_Viewer_Data->end_event_index = Event_Viewer_Data->Num_Visible_Events - 1;
// Test data
- get_test_data((int)Event_Viewer_Data->VAdjust_C->value,
+ get_test_data(Event_Viewer_Data->VAdjust_C->value,
Event_Viewer_Data->Num_Visible_Events,
Event_Viewer_Data);
/* Set the Selected Event */
- Tree_V_set_cursor(Event_Viewer_Data);
+ // Tree_V_set_cursor(Event_Viewer_Data);
+
+
+ g_object_set_data_full(
+ G_OBJECT(Event_Viewer_Data->HBox_V),
+ "Event_Viewer_Data",
+ Event_Viewer_Data,
+ (GDestroyNotify)GuiEvents_free);
return Event_Viewer_Data;
}
if(Event_Viewer_Data->Selected_Event && Event_Viewer_Data->First_Event != -1)
{
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
- Event_Viewer_Data->Currently_Selected_Event);
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+ // Event_Viewer_Data->Currently_Selected_Event);
path = gtk_tree_path_new_from_indices(
Event_Viewer_Data->Currently_Selected_Event-
{
g_critical("need 1 event down") ;
Event_Viewer_Data->Currently_Selected_Event += 1;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, value+1);
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, value+1);
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(Event_Viewer_Data->Num_Visible_Events-1, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
{
g_critical("need 1 event up") ;
Event_Viewer_Data->Currently_Selected_Event -= 1;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, value-1);
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, value-1);
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(0, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
g_critical("need 1 page down") ;
Event_Viewer_Data->Currently_Selected_Event += Event_Viewer_Data->Num_Visible_Events-1;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
- value+(Event_Viewer_Data->Num_Visible_Events-1));
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+ // value+(Event_Viewer_Data->Num_Visible_Events-1));
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(0, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
Event_Viewer_Data->Currently_Selected_Event -= Event_Viewer_Data->Num_Visible_Events-1;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
- value-(Event_Viewer_Data->Num_Visible_Events-1));
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+ // value-(Event_Viewer_Data->Num_Visible_Events-1));
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(0, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
g_critical("need 1 page up") ;
Event_Viewer_Data->Currently_Selected_Event == 0 ;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
- 0);
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+ // 0);
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(0, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
/* move end of buffer */
g_critical("End of buffer") ;
Event_Viewer_Data->Currently_Selected_Event = Event_Viewer_Data->Number_Of_Events-1 ;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
- Event_Viewer_Data->Number_Of_Events -
- Event_Viewer_Data->Num_Visible_Events);
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C,
+ // Event_Viewer_Data->Number_Of_Events -
+ // Event_Viewer_Data->Num_Visible_Events);
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(Event_Viewer_Data->Num_Visible_Events-1, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
/* Move beginning of buffer */
g_critical("Beginning of buffer") ;
Event_Viewer_Data->Currently_Selected_Event = 0 ;
- gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, 0);
+ // gtk_adjustment_set_value(Event_Viewer_Data->VAdjust_C, 0);
//gtk_tree_path_free(path);
//path = gtk_tree_path_new_from_indices(0, -1);
//gtk_tree_view_set_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), path, NULL, FALSE);
{
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;
gtk_tree_view_get_cursor(GTK_TREE_VIEW(Event_Viewer_Data->Tree_V), &path, NULL);
if(gtk_tree_model_get_iter(model,&iter,path)){
gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1);
- ltt_time.tv_sec = time / 1000000000;
- ltt_time.tv_nsec = time % 1000000000;
+ ltt_time.tv_sec = time / NANOSECONDS_PER_SECOND;
+ ltt_time.tv_nsec = time % NANOSECONDS_PER_SECOND;
if(ltt_time.tv_sec != Event_Viewer_Data->current_time.tv_sec ||
ltt_time.tv_nsec != Event_Viewer_Data->current_time.tv_nsec)
g_critical("DEBUG : scroll signal, value : %f", adjustment->value);
- get_test_data((int)adjustment->value, Event_Viewer_Data->Num_Visible_Events,
+ get_test_data(adjustment->value, Event_Viewer_Data->Num_Visible_Events,
Event_Viewer_Data);
NULL, FALSE);
gtk_tree_path_free(Tree_Path);
}
-
+
}
g_critical("number of events shown : %u",Event_Viewer_Data->Num_Visible_Events);
g_critical("ex number of events shown : %f",Exact_Num_Visible);
+/*
Event_Viewer_Data->VAdjust_C->page_increment =
floor(Exact_Num_Visible);
Event_Viewer_Data->VAdjust_C->page_size =
floor(Exact_Num_Visible);
+*/
if(Event_Viewer_Data->Num_Visible_Events != Last_Num_Visible_Events)
{
- get_test_data((int)Event_Viewer_Data->VAdjust_C->value,
+ get_test_data(Event_Viewer_Data->VAdjust_C->value,
Event_Viewer_Data->Num_Visible_Events,
Event_Viewer_Data);
}
}
-void get_test_data(guint Event_Number, guint List_Height,
+void get_test_data(double time_value, guint List_Height,
EventViewerData *Event_Viewer_Data)
{
GtkTreeIter iter;
- int i, j;
+ int i;
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;
-
+ ScrollDirection direction = SCROLL_NONE;
+ GList * first;
+ int Event_Number;
+ double value = Event_Viewer_Data->previous_value - time_value;
+ LttTime start, end, time;
+ LttEvent * ev;
+ unsigned backward_num, minNum, maxNum;
+ LttTracefile * tf;
+ unsigned block_num, event_num;
+ unsigned size = 1, count = 0;
+ gboolean needBackwardAgain, backward;
+
+ g_warning("DEBUG : get_test_data, time value %f\n", time_value);
+
// 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;
+ if(value == -1.0) direction = SCROLL_STEP_DOWN;
+ else if(value == 1.0 ) direction = SCROLL_STEP_UP;
+ else if(value == -2.0) direction = SCROLL_PAGE_DOWN;
+ else if(value == 2.0 ) direction = SCROLL_PAGE_UP;
+ else if(value == 0.0 ) direction = SCROLL_NONE;
+ else direction = SCROLL_JUMP;
+
+ switch(direction){
+ case SCROLL_STEP_UP:
+ case SCROLL_PAGE_UP:
+ if(direction == SCROLL_PAGE_UP){
+ backward = List_Height>Event_Viewer_Data->start_event_index ? TRUE : FALSE;
+ }else{
+ backward = Event_Viewer_Data->start_event_index == 0 ? TRUE : FALSE;
+ }
+ if(backward){
+ Event_Viewer_Data->append = FALSE;
+ do{
+ if(direction == SCROLL_PAGE_UP){
+ minNum = List_Height - Event_Viewer_Data->start_event_index ;
+ }else{
+ minNum = 1;
+ }
- }
- //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;
- }
+ first = Event_Viewer_Data->raw_trace_data_queue->head;
+ raw_data = (RawTraceData*)g_list_nth_data(first,0);
+ end = raw_data->time;
+ end.tv_nsec--;
+ ltt_event_position_get(&raw_data->ep, &block_num, &event_num, &tf);
+ if(size !=0){
+ if(event_num > minNum){
+ backward_num = event_num > RESERVE_SMALL_SIZE
+ ? event_num - RESERVE_SMALL_SIZE : 1;
+ ltt_event_position_set(&raw_data->ep, block_num, backward_num);
+ ltt_tracefile_seek_position(tf, &raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ maxNum = G_MAXULONG;
+ }else{
+ if(block_num > 1){
+ ltt_event_position_set(&raw_data->ep, block_num-1, 1);
+ ltt_tracefile_seek_position(tf, &raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ }else{
+ start.tv_sec = 0;
+ start.tv_nsec = 0;
+ }
+ maxNum = G_MAXULONG;
+ }
+ }else{
+ if(block_num > count){
+ ltt_event_position_set(&raw_data->ep, block_num-count, 1);
+ ltt_tracefile_seek_position(tf, &raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ }else{
+ start.tv_sec = 0;
+ start.tv_nsec = 0;
+ }
+ maxNum = G_MAXULONG;
+ }
- 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->current_event_index = Event_Viewer_Data->start_event_index;
+ get_events(Event_Viewer_Data, start, end, maxNum, &size);
+ Event_Viewer_Data->start_event_index = Event_Viewer_Data->current_event_index;
+
+ if(size < minNum && (start.tv_sec !=0 || start.tv_nsec !=0))
+ needBackwardAgain = TRUE;
+ else needBackwardAgain = FALSE;
+ if(size == 0){
+ count++;
+ }else{
+ count = 0;
+ }
+ }while(needBackwardAgain);
+ }
+ if(direction == SCROLL_STEP_UP)
+ Event_Number = Event_Viewer_Data->start_event_index - 1;
+ else
+ Event_Number = Event_Viewer_Data->start_event_index - List_Height;
+ break;
+ case SCROLL_STEP_DOWN:
+ if(Event_Viewer_Data->end_event_index == Event_Viewer_Data->Number_Of_Events - 1){
+ Event_Viewer_Data->append = TRUE;
+ first = Event_Viewer_Data->raw_trace_data_queue->head;
+ raw_data = (RawTraceData*)g_list_nth_data(first,Event_Viewer_Data->Number_Of_Events - 1);
+ start = raw_data->time;
+ start.tv_nsec++;
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
+ get_events(Event_Viewer_Data, start, end, RESERVE_SMALL_SIZE, &size);
+ }else size = 1;
+ if(size > 0) Event_Number = Event_Viewer_Data->start_event_index + 1;
+ else Event_Number = Event_Viewer_Data->start_event_index;
+ break;
+ case SCROLL_PAGE_DOWN:
+ if(Event_Viewer_Data->end_event_index >= Event_Viewer_Data->Number_Of_Events - 1 - List_Height){
+ Event_Viewer_Data->append = TRUE;
+ first = Event_Viewer_Data->raw_trace_data_queue->head;
+ raw_data = (RawTraceData*)g_list_nth_data(first,Event_Viewer_Data->Number_Of_Events - 1);
+ start = raw_data->time;
+ start.tv_nsec++;
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
+ get_events(Event_Viewer_Data, start, end, RESERVE_SMALL_SIZE,&size);
+ }
+ if(List_Height <= Event_Viewer_Data->Number_Of_Events - 1 - Event_Viewer_Data->end_event_index)
+ Event_Number = Event_Viewer_Data->start_event_index + List_Height - 1;
+ else
+ Event_Number = Event_Viewer_Data->Number_Of_Events - 1 - List_Height;
+ break;
+ case SCROLL_JUMP:
+ Event_Viewer_Data->append = TRUE;
+ remove_all_items_from_queue(Event_Viewer_Data->raw_trace_data_queue);
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
+ time = ltt_time_from_double(time_value / NANOSECONDS_PER_SECOND);
+ start = ltt_time_add(Event_Viewer_Data->time_span.startTime, time);
+ Event_Viewer_Data->previous_value = time_value;
+ get_events(Event_Viewer_Data, start, end, RESERVE_SMALL_SIZE,&size);
+ if(size < List_Height){
+ Event_Viewer_Data->append = FALSE;
+ first = Event_Viewer_Data->raw_trace_data_queue->head;
+ raw_data = (RawTraceData*)g_list_nth_data(first,0);
+ end = raw_data->time;
+ end.tv_nsec--;
+ ltt_event_position_get(&raw_data->ep, &block_num, &event_num, &tf);
+
+ if(event_num > List_Height - size){
+ backward_num = event_num > RESERVE_SMALL_SIZE
+ ? event_num - RESERVE_SMALL_SIZE : 1;
+ ltt_event_position_set(&raw_data->ep, block_num, backward_num);
+ ltt_tracefile_seek_position(tf, &raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ maxNum = G_MAXULONG;
+ Event_Viewer_Data->current_event_index = 0;
+ get_events(Event_Viewer_Data, start, end, maxNum, &size);
+ Event_Viewer_Data->start_event_index = Event_Viewer_Data->current_event_index;
+ }
+ Event_Number = Event_Viewer_Data->raw_trace_data_queue->length - List_Height;
+ }else{
+ Event_Number = 0;
+ }
+ break;
+ case SCROLL_NONE:
+ Event_Number = Event_Viewer_Data->current_event_index;
+ break;
+ default:
+ break;
+ }
- 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;
- }
+ //update the value of the scroll bar
+ if(direction != SCROLL_NONE && direction != SCROLL_JUMP){
+ first = Event_Viewer_Data->raw_trace_data_queue->head;
+ raw_data = (RawTraceData*)g_list_nth_data(first,Event_Number);
+ time = ltt_time_sub(raw_data->time, Event_Viewer_Data->time_span.startTime);
+ Event_Viewer_Data->VAdjust_C->value = ltt_time_to_double(time) * NANOSECONDS_PER_SECOND;
+ g_signal_stop_emission_by_name(G_OBJECT(Event_Viewer_Data->VAdjust_C), "value-changed");
+ Event_Viewer_Data->previous_value = value;
}
- 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;
+ Event_Viewer_Data->start_event_index = Event_Number;
+ Event_Viewer_Data->end_event_index = Event_Number + List_Height - 1;
+
+ first = Event_Viewer_Data->raw_trace_data_queue->head;
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;
+ guint64 real_data;
- 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);
+ if(i>=Event_Viewer_Data->Number_Of_Events) break;
+
+ raw_data = (RawTraceData*)g_list_nth_data(first, i);
- /* Add a new row to the model */
+ // Add a new row to the model
+ real_data = raw_data->time.tv_sec;
+ real_data *= NANOSECONDS_PER_SECOND;
+ 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,
-1);
/*
+ gtk_list_store_append (Event_Viewer_Data->Store_M, &iter);
gtk_list_store_set (Event_Viewer_Data->Store_M, &iter,
CPUID_COLUMN, 0,
EVENT_COLUMN, "event irq",
}
//}
#endif //DEBUG
- Event_Viewer_Data->First_Event = Event_Number ;
- Event_Viewer_Data->Last_Event = Event_Number+List_Height-1 ;
+ Event_Viewer_Data->First_Event = Event_Viewer_Data->start_event_index ;
+ Event_Viewer_Data->Last_Event = Event_Viewer_Data->end_event_index ;
}
+void
+GuiEvents_free(EventViewerData *Event_Viewer_Data)
+{
+ if(Event_Viewer_Data){
+ lttv_hooks_remove(Event_Viewer_Data->before_event_hooks,parse_event);
+ lttv_hooks_destroy(Event_Viewer_Data->before_event_hooks);
+
+ remove_all_items_from_queue (Event_Viewer_Data->raw_trace_data_queue);
+ g_queue_free(Event_Viewer_Data->raw_trace_data_queue);
+ g_queue_free(Event_Viewer_Data->raw_trace_data_queue_tmp);
+
+ UnregUpdateTimeWindow(updateTimeWindow,Event_Viewer_Data, Event_Viewer_Data->mw);
+ UnregUpdateCurrentTime(updateCurrentTime,Event_Viewer_Data, Event_Viewer_Data->mw);
+
+ sEvent_Viewer_Data_List = g_slist_remove(sEvent_Viewer_Data_List, Event_Viewer_Data);
+ g_warning("Delete Event data\n");
+ g_free(Event_Viewer_Data);
+ }
+}
void
GuiEvents_Destructor(EventViewerData *Event_Viewer_Data)
guint index;
/* May already been done by GTK window closing */
- if(GTK_IS_WIDGET(Event_Viewer_Data->HBox_V))
+ if(GTK_IS_WIDGET(Event_Viewer_Data->HBox_V)){
gtk_widget_destroy(Event_Viewer_Data->HBox_V);
+ Event_Viewer_Data = NULL;
+ }
/* Destroy the Tree View */
//gtk_widget_destroy(Event_Viewer_Data->Tree_V);
//gtk_list_store_clear(Event_Viewer_Data->Store_M);
//gtk_widget_destroy(GTK_WIDGET(Event_Viewer_Data->Store_M));
- g_slist_remove(sEvent_Viewer_Data_List,Event_Viewer_Data);
- g_free(Event_Viewer_Data);
+ g_warning("Delete Event data from destroy\n");
+ //GuiEvents_free(Event_Viewer_Data);
}
//FIXME : call hGuiEvents_Destructor for corresponding data upon widget destroy
}
-gboolean updateTimeInterval(void * hook_data, void * call_data)
+gboolean updateTimeWindow(void * hook_data, void * call_data)
{
EventViewerData *Event_Viewer_Data = (EventViewerData*) hook_data;
- Event_Viewer_Data->time_interval = *(TimeInterval*)call_data;
+ Event_Viewer_Data->time_window = *(TimeWindow*)call_data;
return FALSE;
}
{
EventViewerData *Event_Viewer_Data = (EventViewerData*) hook_data;
Event_Viewer_Data->current_time = *(LttTime*)call_data;
- unsigned long nsec = Event_Viewer_Data->current_time.tv_sec * 1000000000
- + Event_Viewer_Data->current_time.tv_nsec;
+ uint64_t nsec = Event_Viewer_Data->current_time.tv_sec * NANOSECONDS_PER_SECOND
+ + Event_Viewer_Data->current_time.tv_nsec;
GtkTreeIter iter;
- unsigned long time;
+ uint64_t time;
int count = 0;
GtkTreeModel* model = (GtkTreeModel*)Event_Viewer_Data->Store_M;
}
// Event_Selected_Hook(Event_Viewer_Data, &count);
}
-
+
return FALSE;
}
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, unsigned * realNumEvent)
{
+ int size;
+ RawTraceData * data;
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);
-
+
+ size = Event_Viewer_Data->raw_trace_data_queue_tmp->length;
+ *realNumEvent = size;
+ if(size > 0){
+ int pid, tmpPid, i;
+ GList * list, *tmpList;
+
+ //if the queue is full, remove some data, keep the size of the queue constant
+ while(Event_Viewer_Data->raw_trace_data_queue->length + size > RESERVE_BIG_SIZE){
+ remove_item_from_queue(Event_Viewer_Data->raw_trace_data_queue,
+ Event_Viewer_Data->append);
+ }
+
+ //update pid if it is not known
+ if(Event_Viewer_Data->raw_trace_data_queue->length > 0){
+ list = Event_Viewer_Data->raw_trace_data_queue->head;
+ tmpList = Event_Viewer_Data->raw_trace_data_queue_tmp->head;
+ if(Event_Viewer_Data->append){
+ data = (RawTraceData*)g_list_nth_data(list, Event_Viewer_Data->raw_trace_data_queue->length-1);
+ pid = data->pid;
+ data = (RawTraceData*)g_list_nth_data(tmpList, 0);
+ tmpPid = data->pid;
+ }else{
+ data = (RawTraceData*)g_list_nth_data(list, 0);
+ pid = data->pid;
+ data = (RawTraceData*)g_list_nth_data(tmpList, Event_Viewer_Data->raw_trace_data_queue_tmp->length-1);
+ tmpPid = data->pid;
+ }
+
+ if(pid == -1 && tmpPid != -1){
+ for(i=0;i<Event_Viewer_Data->raw_trace_data_queue->length;i++){
+ data = (RawTraceData*)g_list_nth_data(list,i);
+ if(data->pid == -1) data->pid = tmpPid;
+ }
+ }else if(pid != -1 && tmpPid == -1){
+ for(i=0;i<Event_Viewer_Data->raw_trace_data_queue_tmp->length;i++){
+ data = (RawTraceData*)g_list_nth_data(tmpList,i);
+ if(data->pid == -1) data->pid = tmpPid;
+ }
+ }
+ }
+
+ //add data from tmp queue into the queue
+ Event_Viewer_Data->Number_Of_Events = Event_Viewer_Data->raw_trace_data_queue->length
+ + Event_Viewer_Data->raw_trace_data_queue_tmp->length;
+ if(Event_Viewer_Data->append){
+ if(Event_Viewer_Data->raw_trace_data_queue->length > 0)
+ Event_Viewer_Data->current_event_index = Event_Viewer_Data->raw_trace_data_queue->length - 1;
+ else Event_Viewer_Data->current_event_index = 0;
+ while((data = g_queue_pop_head(Event_Viewer_Data->raw_trace_data_queue_tmp)) != NULL){
+ g_queue_push_tail(Event_Viewer_Data->raw_trace_data_queue, data);
+ }
+ }else{
+ Event_Viewer_Data->current_event_index += Event_Viewer_Data->raw_trace_data_queue_tmp->length;
+ while((data = g_queue_pop_tail(Event_Viewer_Data->raw_trace_data_queue_tmp)) != NULL){
+ g_queue_push_head(Event_Viewer_Data->raw_trace_data_queue, data);
+ }
+ }
+ }
}
static void get_event_detail(LttEvent *e, LttField *f, GString * s)
unsigned in=0, out=0;
int i;
GString * detailEvent = g_string_new("");
+ GList * list;
+
e = tfc->e;
field = ltt_event_field(e);
time = ltt_event_time(e);
- if(Event_Viewer_Data->raw_trace_data->len)
- prevRawTraceData=g_ptr_array_index(Event_Viewer_Data->raw_trace_data,
- Event_Viewer_Data->raw_trace_data->len-1);
- if(Event_Viewer_Data->raw_trace_data->len >= RESERVE_SIZE){
- if(time.tv_sec != prevRawTraceData->time.tv_sec ||
- time.tv_nsec != prevRawTraceData->time.tv_nsec)
- return FALSE;
+ if(Event_Viewer_Data->raw_trace_data_queue_tmp->length){
+ list = g_list_last(Event_Viewer_Data->raw_trace_data_queue_tmp->head);
+ prevRawTraceData = (RawTraceData *)(list->data);
}
tmpRawTraceData = g_new(RawTraceData,1);
get_pid(&in, &out, detailEvent->str);
}
+
if(in != 0 || out != 0){
tmpRawTraceData->pid = in;
if(prevRawTraceData && prevRawTraceData->pid == -1){
- for(i=0;i<Event_Viewer_Data->raw_trace_data->len;i++){
- data = g_ptr_array_index(Event_Viewer_Data->raw_trace_data,i);
+ list = Event_Viewer_Data->raw_trace_data_queue_tmp->head;
+ for(i=0;i<Event_Viewer_Data->raw_trace_data_queue_tmp->length;i++){
+ data = (RawTraceData *)g_list_nth_data(list,i);
data->pid = out;
}
}
}
- g_ptr_array_add(Event_Viewer_Data->raw_trace_data, tmpRawTraceData);
+ ltt_event_position(e, &tmpRawTraceData->ep);
+
+ if(Event_Viewer_Data->raw_trace_data_queue_tmp->length >= RESERVE_SMALL_SIZE){
+ if(Event_Viewer_Data->append){
+ list = g_list_last(Event_Viewer_Data->raw_trace_data_queue_tmp->head);
+ data = (RawTraceData *)(list->data);
+ if(data->time.tv_sec == time.tv_sec &&
+ data->time.tv_nsec == time.tv_nsec){
+ g_queue_push_tail(Event_Viewer_Data->raw_trace_data_queue_tmp,tmpRawTraceData);
+ }else{
+ g_free(tmpRawTraceData);
+ }
+ }else{
+ remove_item_from_queue(Event_Viewer_Data->raw_trace_data_queue_tmp,TRUE);
+ g_queue_push_tail(Event_Viewer_Data->raw_trace_data_queue_tmp,tmpRawTraceData);
+ }
+ }else{
+ g_queue_push_tail (Event_Viewer_Data->raw_trace_data_queue_tmp,tmpRawTraceData);
+ }
g_string_free(detailEvent, TRUE);
return FALSE;
}
+void remove_item_from_queue(GQueue * q, gboolean fromHead)
+{
+ RawTraceData *data1, *data2 = NULL;
+ GList * list;
+
+ if(fromHead){
+ data1 = (RawTraceData *)g_queue_pop_head(q);
+ list = g_list_first(q->head);
+ if(list)
+ data2 = (RawTraceData *)(list->data);
+ }else{
+ data1 = (RawTraceData *)g_queue_pop_tail(q);
+ list = g_list_last(q->head);
+ if(list)
+ data2 = (RawTraceData *)(list->data);
+ }
+
+ if(data2){
+ if(data1->time.tv_sec == data2->time.tv_sec &&
+ data1->time.tv_nsec == data2->time.tv_nsec){
+ remove_item_from_queue(q, fromHead);
+ }
+ }
+
+ g_free(data1);
+
+ return;
+}
+
+void remove_all_items_from_queue(GQueue *q)
+{
+ RawTraceData *data;
+ while((data = (RawTraceData *)g_queue_pop_head(q)) != NULL){
+ g_free(data);
+ }
+}
+
+