X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Fgui%2Fdetailedevents%2Fevents.c;h=84af45a060e2b0ee98d7da31b7faf2abd73f1680;hb=5698740e7329b8a34faf0c178ff44a5e21654cdc;hp=db39fcbc5ec43084b2fbfd580bdf8313edc3187a;hpb=c8e8c5d87ae4834d48adece03a7d9999fff08024;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c index db39fcbc..84af45a0 100644 --- a/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c +++ b/ltt/branches/poly/lttv/modules/gui/detailedevents/events.c @@ -78,6 +78,9 @@ #define abs(a) (((a)<0)?(-a):(a)) #define max(a,b) ((a)>(b)?(a):(b)) +/* Number of events between checks for GDK events (stop button) */ +#define CHECK_GDK_INTERVAL 50000 + /** Array containing instanced objects. Used when module is unloaded */ static GSList *g_event_viewer_data_list = NULL ; @@ -144,6 +147,8 @@ typedef struct _EventViewerData { guint32 last_tree_update_time; /* To filter out repeat keys */ + guint num_events; /* Number of events processed */ + } EventViewerData ; /** hook functions for update time interval, current time ... */ @@ -1286,6 +1291,9 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) double value = new_value - event_viewer_data->previous_value; + /* Set stop button status for foreground processing */ + event_viewer_data->tab->stop_foreground = FALSE; + /* See where we have to scroll... */ ScrollDirection direction; gint relative_position; @@ -1447,11 +1455,14 @@ static void get_events(double new_value, EventViewerData *event_viewer_data) /* Mathieu : * I make the choice not to use the mainwindow lttvwindow API here : the idle * loop might have a too low priority, and we want good update while - * scrolling. + * scrolling. However, we call the gdk loop to get events periodically so the + * processing can be stopped. */ lttv_process_traceset_begin(tsc, NULL, NULL, NULL, event_viewer_data->event_hooks, NULL); + + event_viewer_data->num_events = 0; lttv_process_traceset_middle(tsc, ltt_time_infinite, G_MAXUINT, NULL); @@ -1490,6 +1501,14 @@ int event_hook(void *hook_data, void *call_data) LttvTracefileState *tfs = (LttvTracefileState*)call_data; LttEvent *e = ltt_tracefile_get_event(tfc->tf); + event_viewer_data->num_events++; + if(event_viewer_data->num_events % CHECK_GDK_INTERVAL == 0) { + while(gtk_events_pending ()) + gtk_main_iteration(); + if(event_viewer_data->tab->stop_foreground) + return TRUE; + } + LttvFilter *filter = event_viewer_data->main_win_filter; if(filter != NULL && filter->head != NULL) if(!lttv_filter_tree_parse(filter->head,e,tfc->tf,