#include <lttv/module.h>
#include <lttv/hook.h>
#include <lttv/gtkTraceSet.h>
-#include <lttv/gtkcustomhbox.h>
#include <lttv/processTrace.h>
#include <lttv/state.h>
#include <ltt/ltt.h>
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);
-void remove_instance(GtkCustomHBox * box);
typedef struct _RawTraceData{
unsigned cpu_id;
typedef struct _EventViewerData {
mainWindow * mw;
- TimeInterval time_interval;
+ TimeWindow time_window;
LttTime current_time;
LttvHooks * before_event_hooks;
GQueue * raw_trace_data_queue_tmp; //tmp buf to contain raw data
unsigned current_event_index;
double previous_value; //value of the slide
- LttTime trace_start;
- LttTime trace_end;
+ 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
- GtkWidget * instance_container; //box to contain all widgets
//scroll window containing Tree View
GtkWidget * Scroll_Win;
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);
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()");
EventViewerData* Event_Viewer_Data = GuiEvents(pmParentWindow) ;
if(Event_Viewer_Data)
- return Event_Viewer_Data->instance_container;
+ return Event_Viewer_Data->HBox_V;
else return NULL;
}
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->before_event_hooks = lttv_hooks_new();
Event_Viewer_Data->raw_trace_data_queue = g_queue_new();
Event_Viewer_Data->raw_trace_data_queue_tmp = g_queue_new();
- RegUpdateTimeInterval(updateTimeInterval,Event_Viewer_Data, Event_Viewer_Data->mw);
+ 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);
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_UINT64, /* 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));
gtk_container_add (GTK_CONTAINER (Event_Viewer_Data->Scroll_Win), Event_Viewer_Data->Tree_V);
- Event_Viewer_Data->instance_container = gtk_custom_hbox_new(0, 0, remove_instance);
Event_Viewer_Data->HBox_V = gtk_hbox_new(0, 0);
gtk_box_pack_start(GTK_BOX(Event_Viewer_Data->HBox_V), Event_Viewer_Data->Scroll_Win, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(Event_Viewer_Data->instance_container), Event_Viewer_Data->HBox_V, TRUE, TRUE, 0);
/* Create vertical scrollbar and pack it */
Event_Viewer_Data->VScroll_VC = gtk_vscrollbar_new(NULL);
// 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->instance_container);
gtk_widget_show(Event_Viewer_Data->HBox_V);
gtk_widget_show(Event_Viewer_Data->Tree_V);
gtk_widget_show(Event_Viewer_Data->VScroll_VC);
Event_Viewer_Data->Num_Visible_Events = 1;
//get the life span of the traceset and set the upper of the scroll bar
- getTracesetTimeSpan(Event_Viewer_Data->mw, &Event_Viewer_Data->trace_start,
- &Event_Viewer_Data->trace_end);
- time_value = Event_Viewer_Data->trace_end.tv_sec - Event_Viewer_Data->trace_start.tv_sec;
- time_value *= NANSECOND_CONST;
- time_value += (double)Event_Viewer_Data->trace_end.tv_nsec - Event_Viewer_Data->trace_start.tv_nsec;
+ getTracesetTimeSpan(Event_Viewer_Data->mw, &Event_Viewer_Data->time_span);
+
+ time_value = Event_Viewer_Data->time_span.endTime.tv_sec - Event_Viewer_Data->time_span.startTime.tv_sec;
+ time_value *= NANOSECONDS_PER_SECOND;
+ time_value += (double)Event_Viewer_Data->time_span.endTime.tv_nsec - Event_Viewer_Data->time_span.startTime.tv_nsec;
Event_Viewer_Data->VAdjust_C->upper = time_value;
Event_Viewer_Data->append = TRUE;
/* Set the Selected Event */
// 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;
}
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 / NANSECOND_CONST;
- ltt_time.tv_nsec = time % NANSECOND_CONST;
+ 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)
remove_all_items_from_queue(Event_Viewer_Data->raw_trace_data_queue);
end.tv_sec = G_MAXULONG;
end.tv_nsec = G_MAXULONG;
- start = Event_Viewer_Data->trace_start;
- value = (int)(time_value / NANSECOND_CONST);
+ start = Event_Viewer_Data->time_span.startTime;
+ value = (int)(time_value / NANOSECONDS_PER_SECOND);
start.tv_sec += value;
- value = time_value / NANSECOND_CONST - value;
- value *= NANSECOND_CONST;
+ value = time_value / NANOSECONDS_PER_SECOND - value;
+ value *= NANOSECONDS_PER_SECOND;
start.tv_nsec += value;
- if(start.tv_nsec > NANSECOND_CONST){
+ if(start.tv_nsec > NANOSECONDS_PER_SECOND){
start.tv_sec++;
- start.tv_nsec -= NANSECOND_CONST;
+ start.tv_nsec -= NANOSECONDS_PER_SECOND;
}
Event_Viewer_Data->previous_value = time_value;
get_events(Event_Viewer_Data, start, end, RESERVE_SMALL_SIZE,&size);
first = Event_Viewer_Data->raw_trace_data_queue->head;
raw_data = (RawTraceData*)g_list_nth_data(first,Event_Number);
value = raw_data->time.tv_sec;
- value -= Event_Viewer_Data->trace_start.tv_sec;
- value *= NANSECOND_CONST;
- value -= Event_Viewer_Data->trace_start.tv_nsec;
+ value -= Event_Viewer_Data->time_span.startTime.tv_sec;
+ value *= NANOSECONDS_PER_SECOND;
+ value -= Event_Viewer_Data->time_span.startTime.tv_nsec;
value += raw_data->time.tv_nsec;
Event_Viewer_Data->VAdjust_C->value = value;
g_signal_stop_emission_by_name(G_OBJECT(Event_Viewer_Data->VAdjust_C), "value-changed");
// Add a new row to the model
real_data = raw_data->time.tv_sec;
- real_data *= NANSECOND_CONST;
+ 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,
}
+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->instance_container))
- gtk_widget_destroy(Event_Viewer_Data->instance_container);
+ 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));
- 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);
-
- UnregUpdateTimeInterval(updateTimeInterval,Event_Viewer_Data, Event_Viewer_Data->mw);
- UnregUpdateCurrentTime(updateCurrentTime,Event_Viewer_Data, Event_Viewer_Data->mw);
-
- 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;
- uint64_t nsec = Event_Viewer_Data->current_time.tv_sec * NANSECOND_CONST
+ uint64_t nsec = Event_Viewer_Data->current_time.tv_sec * NANOSECONDS_PER_SECOND
+ Event_Viewer_Data->current_time.tv_nsec;
GtkTreeIter iter;
uint64_t time;
void Tree_V_grab_focus(GtkWidget *widget, gpointer data){
EventViewerData *Event_Viewer_Data = (EventViewerData *)data;
mainWindow * mw = Event_Viewer_Data->mw;
- SetFocusedPane(mw, gtk_widget_get_parent(Event_Viewer_Data->instance_container));
+ SetFocusedPane(mw, gtk_widget_get_parent(Event_Viewer_Data->HBox_V));
}
void get_events(EventViewerData* Event_Viewer_Data, LttTime start,
}
}
-void remove_instance(GtkCustomHBox * box){
- int i;
- EventViewerData *Event_Viewer_Data ;
-
- for(i=0;i<g_slist_length(sEvent_Viewer_Data_List);i++){
- Event_Viewer_Data = (EventViewerData *)g_slist_nth_data(sEvent_Viewer_Data_List, i);
- if((void*)box == (void*)Event_Viewer_Data->instance_container){
- sEvent_Viewer_Data_List = g_slist_remove(sEvent_Viewer_Data_List, Event_Viewer_Data);
- break;
- }
- }
-}
-