X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiEvents.c;h=0242a373ee098de5bf5aa806e557c8f70b03e5ec;hb=bbb9e8106c6633e3533cbedb3c7a45912c041e7b;hp=051147e75fb12933aa5ae9c1b74784231cef6dfa;hpb=a8c0f09de06b94e9420d286e1541c39092fff434;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiEvents.c b/ltt/branches/poly/lttv/modules/guiEvents.c index 051147e7..0242a373 100644 --- a/ltt/branches/poly/lttv/modules/guiEvents.c +++ b/ltt/branches/poly/lttv/modules/guiEvents.c @@ -41,6 +41,7 @@ #include #include #include +#include #include //#include "mw_api.h" @@ -64,8 +65,10 @@ typedef struct _RawTraceData{ LttEventPosition *ep; } RawTraceData; -#define RESERVE_BIG_SIZE 1000 -#define RESERVE_SMALL_SIZE 100 +#define RESERVE_BIG_SIZE 1000 +#define RESERVE_SMALL_SIZE 100 +#define RESERVE_SMALL_SIZE_SQUARE RESERVE_SMALL_SIZE*RESERVE_SMALL_SIZE +#define RESERVE_SMALL_SIZE_CUBE RESERVE_SMALL_SIZE*RESERVE_SMALL_SIZE_SQUARE typedef enum _ScrollDirection{ SCROLL_STEP_UP, @@ -875,7 +878,7 @@ void get_test_data(double time_value, guint list_height, ltt_tracefile_seek_position(tf, raw_data->ep); ev = ltt_tracefile_read(tf); start = ltt_event_time(ev); - maxNum = G_MAXULONG; + maxNum = RESERVE_SMALL_SIZE_CUBE; }else{ if(block_num > 1){ ltt_event_position_set(raw_data->ep, block_num-1, 1); @@ -886,7 +889,7 @@ void get_test_data(double time_value, guint list_height, start.tv_sec = 0; start.tv_nsec = 0; } - maxNum = G_MAXULONG; + maxNum = RESERVE_SMALL_SIZE_CUBE; } }else{ if(block_num > count){ @@ -898,7 +901,7 @@ void get_test_data(double time_value, guint list_height, start.tv_sec = 0; start.tv_nsec = 0; } - maxNum = G_MAXULONG; + maxNum = RESERVE_SMALL_SIZE_CUBE; } event_viewer_data->current_event_index = event_viewer_data->start_event_index; @@ -931,12 +934,20 @@ void get_test_data(double time_value, guint list_height, 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; + if(size == 0){ + get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size); + if(size == 0) + get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size); + } + if(size==0) event_number = event_viewer_data->start_event_index; + else event_number = event_viewer_data->number_of_events - size - list_height + 1; + }else event_number = event_viewer_data->start_event_index + 1; break; case SCROLL_PAGE_DOWN: - if(event_viewer_data->end_event_index >= event_viewer_data->number_of_events - 1 - list_height){ + i = event_viewer_data->number_of_events - 1 - list_height; + if((gint)(event_viewer_data->end_event_index) >= i){ + int remain_events = event_viewer_data->number_of_events - 1 + - event_viewer_data->end_event_index; event_viewer_data->append = TRUE; first = event_viewer_data->raw_trace_data_queue->head; if(!first)break; @@ -946,11 +957,17 @@ void get_test_data(double time_value, guint list_height, 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; + if(size == 0){ + get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size); + if(size == 0) + get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size); + } + remain_events += size; + if(list_height <= remain_events) + event_number = event_viewer_data->number_of_events - remain_events - 1; + else + event_number = event_viewer_data->number_of_events - 1 - list_height; + }else event_number = event_viewer_data->start_event_index + list_height - 1; break; case SCROLL_JUMP: event_viewer_data->append = TRUE; @@ -961,7 +978,7 @@ void get_test_data(double time_value, guint list_height, 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){ + if(size < list_height && size > 0){ event_viewer_data->append = FALSE; first = event_viewer_data->raw_trace_data_queue->head; if(!first)break; @@ -977,12 +994,17 @@ void get_test_data(double time_value, guint list_height, ltt_tracefile_seek_position(tf, raw_data->ep); ev = ltt_tracefile_read(tf); start = ltt_event_time(ev); - maxNum = G_MAXULONG; + maxNum = RESERVE_SMALL_SIZE_CUBE; 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 if(size == 0){ + get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size); + if(size == 0) + get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size); + event_number = 0; }else{ event_number = 0; } @@ -1001,6 +1023,7 @@ void get_test_data(double time_value, guint list_height, first = event_viewer_data->raw_trace_data_queue->head; if(first){ raw_data = (RawTraceData*)g_list_nth_data(first,event_number); + if(!raw_data) raw_data = (RawTraceData*)g_list_nth_data(first,0); 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"); @@ -1011,6 +1034,9 @@ void get_test_data(double time_value, guint list_height, event_viewer_data->start_event_index = event_number; event_viewer_data->end_event_index = event_number + list_height - 1; + if(event_viewer_data->end_event_index > event_viewer_data->number_of_events - 1){ + event_viewer_data->end_event_index = event_viewer_data->number_of_events - 1; + } first = event_viewer_data->raw_trace_data_queue->head; gtk_list_store_clear(event_viewer_data->store_m); @@ -1218,11 +1244,14 @@ int event_selected_hook(void *hook_data, void *call_data) } - +/* If every module uses the filter, maybe these two + * (add/remove_context_hooks functions) should be put in common place + */ void add_context_hooks(EventViewerData * event_viewer_data, LttvTracesetContext * tsc) { - gint i, j, nbi, nb_tracefile, nb_control, nb_per_cpu; + gint i, j, k, m,n, nbi, id; + gint nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event; LttTrace *trace; LttvTraceContext *tc; LttvTracefileContext *tfc; @@ -1230,6 +1259,9 @@ void add_context_hooks(EventViewerData * event_viewer_data, LttvTraceSelector * t_s; LttvTracefileSelector * tf_s; gboolean selected; + LttFacility * fac; + LttEventType * et; + LttvEventtypeSelector * eventtype; ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(event_viewer_data->hbox_v), event_viewer_data->filter_key); @@ -1238,7 +1270,7 @@ void add_context_hooks(EventViewerData * event_viewer_data, nbi = lttv_traceset_number(tsc->ts); for(i = 0 ; i < nbi ; i++) { - t_s = lttv_traceset_selector_get(ts_s,i); + t_s = lttv_traceset_selector_trace_get(ts_s,i); selected = lttv_trace_selector_get_selected(t_s); if(!selected) continue; tc = tsc->traces[i]; @@ -1250,7 +1282,7 @@ void add_context_hooks(EventViewerData * event_viewer_data, nb_tracefile = nb_control + nb_per_cpu; for(j = 0 ; j < nb_tracefile ; j++) { - tf_s = lttv_trace_selector_get(t_s,j); + tf_s = lttv_trace_selector_tracefile_get(t_s,j); selected = lttv_tracefile_selector_get_selected(tf_s); if(!selected) continue; @@ -1260,8 +1292,28 @@ void add_context_hooks(EventViewerData * event_viewer_data, tfc = tc->per_cpu_tracefiles[j - nb_control]; //if there are hooks for tracefile, add them here - lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL, - event_viewer_data->before_event_hooks,NULL); + // lttv_tracefile_context_add_hooks(tfc, NULL,NULL,NULL,NULL, + // event_viewer_data->before_event_hooks,NULL); + + nb_facility = ltt_trace_facility_number(trace); + n = 0; + for(k=0;kbefore_event_hooks, + NULL); + } + n++; + } + } + } } @@ -1274,7 +1326,8 @@ void add_context_hooks(EventViewerData * event_viewer_data, void remove_context_hooks(EventViewerData * event_viewer_data, LttvTracesetContext * tsc) { - gint i, j, nbi, nb_tracefile, nb_control, nb_per_cpu; + gint i, j, k, m, nbi, n, id; + gint nb_tracefile, nb_control, nb_per_cpu, nb_facility, nb_event; LttTrace *trace; LttvTraceContext *tc; LttvTracefileContext *tfc; @@ -1282,6 +1335,9 @@ void remove_context_hooks(EventViewerData * event_viewer_data, LttvTraceSelector * t_s; LttvTracefileSelector * tf_s; gboolean selected; + LttFacility * fac; + LttEventType * et; + LttvEventtypeSelector * eventtype; ts_s = (LttvTracesetSelector*)g_object_get_data(G_OBJECT(event_viewer_data->hbox_v), event_viewer_data->filter_key); @@ -1290,7 +1346,7 @@ void remove_context_hooks(EventViewerData * event_viewer_data, nbi = lttv_traceset_number(tsc->ts); for(i = 0 ; i < nbi ; i++) { - t_s = lttv_traceset_selector_get(ts_s,i); + t_s = lttv_traceset_selector_trace_get(ts_s,i); selected = lttv_trace_selector_get_selected(t_s); if(!selected) continue; tc = tsc->traces[i]; @@ -1302,7 +1358,7 @@ void remove_context_hooks(EventViewerData * event_viewer_data, nb_tracefile = nb_control + nb_per_cpu; for(j = 0 ; j < nb_tracefile ; j++) { - tf_s = lttv_trace_selector_get(t_s,j); + tf_s = lttv_trace_selector_tracefile_get(t_s,j); selected = lttv_tracefile_selector_get_selected(tf_s); if(!selected) continue; @@ -1312,8 +1368,25 @@ void remove_context_hooks(EventViewerData * event_viewer_data, tfc = tc->per_cpu_tracefiles[j - nb_control]; //if there are hooks for tracefile, remove them here - lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL, - event_viewer_data->before_event_hooks,NULL); + // lttv_tracefile_context_remove_hooks(tfc, NULL,NULL,NULL,NULL, + // event_viewer_data->before_event_hooks,NULL); + + nb_facility = ltt_trace_facility_number(trace); + n = 0; + for(k=0;k 0){ - int pid, tmpPid, i; + int pid, tmpPid, i,j,len; GList * list, *tmpList; + GArray * pid_array, * tmp_pid_array; + + pid_array = g_array_sized_new(FALSE, TRUE, sizeof(int), 10); + tmp_pid_array = g_array_sized_new(FALSE, TRUE, sizeof(int), 10); //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){ @@ -1409,30 +1486,95 @@ void update_raw_data_array(EventViewerData* event_viewer_data, unsigned size) 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; + for(i= event_viewer_data->raw_trace_data_queue->length-1;i>=0;i--){ + data = (RawTraceData*)g_list_nth_data(list,i); + len = data->pid==0 ? -2 : data->pid; + if(data->cpu_id+1 > pid_array->len){ + pid_array = g_array_set_size(pid_array,data->cpu_id+1); + pid_array = g_array_insert_val(pid_array,data->cpu_id,len); + pid_array = g_array_remove_index(pid_array,data->cpu_id+1); + }else if(data->cpu_id+1 < pid_array->len){ + pid = g_array_index(pid_array,int,data->cpu_id); + if(pid == 0){ + pid_array = g_array_insert_val(pid_array,data->cpu_id,len); + pid_array = g_array_remove_index(pid_array,data->cpu_id+1); + } + } + } + + for(i=0;iraw_trace_data_queue_tmp->length-1;i++){ + data = (RawTraceData*)g_list_nth_data(tmpList,i); + len = data->pid==0 ? -2 : data->pid; + if(data->cpu_id+1 > tmp_pid_array->len){ + tmp_pid_array = g_array_set_size(tmp_pid_array,data->cpu_id+1); + tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len); + tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1); + }else if(data->cpu_id+1 < tmp_pid_array->len){ + pid = g_array_index(tmp_pid_array,int,data->cpu_id); + if(pid == 0){ + tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len); + tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1); + } + } + } }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;iraw_trace_data_queue->length;i++){ + for(i=0;iraw_trace_data_queue->length-1;i++){ data = (RawTraceData*)g_list_nth_data(list,i); - if(data->pid == -1) data->pid = tmpPid; + len = data->pid==0 ? -2 : data->pid; + if(data->cpu_id+1 > pid_array->len){ + pid_array = g_array_set_size(pid_array,data->cpu_id+1); + pid_array = g_array_insert_val(pid_array,data->cpu_id,len); + pid_array = g_array_remove_index(pid_array,data->cpu_id+1); + }else if(data->cpu_id+1 < pid_array->len){ + pid = g_array_index(pid_array,int,data->cpu_id); + if(pid == 0){ + pid_array = g_array_insert_val(pid_array,data->cpu_id,len); + pid_array = g_array_remove_index(pid_array,data->cpu_id+1); + } + } } - }else if(pid != -1 && tmpPid == -1){ - for(i=0;iraw_trace_data_queue_tmp->length;i++){ + + for(i=event_viewer_data->raw_trace_data_queue_tmp->length-1;i>=0;i--){ data = (RawTraceData*)g_list_nth_data(tmpList,i); - if(data->pid == -1) data->pid = pid; + len = data->pid==0 ? -2 : data->pid; + if(data->cpu_id+1 > tmp_pid_array->len){ + tmp_pid_array = g_array_set_size(tmp_pid_array,data->cpu_id+1); + tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len); + tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1); + }else if(data->cpu_id+1 < tmp_pid_array->len){ + pid = g_array_index(tmp_pid_array,int,data->cpu_id); + if(pid == 0){ + tmp_pid_array = g_array_insert_val(tmp_pid_array,data->cpu_id,len); + tmp_pid_array = g_array_remove_index(tmp_pid_array,data->cpu_id+1); + } + } + } + } + + len = pid_array->len > tmp_pid_array->len ? tmp_pid_array->len : pid_array->len; + for(j=0;jraw_trace_data_queue->length;i++){ + data = (RawTraceData*)g_list_nth_data(list,i); + if(data->pid == -1 && data->cpu_id == j) data->pid = tmpPid; + } + }else if(pid != -1 && tmpPid == -1){ + for(i=0;iraw_trace_data_queue_tmp->length;i++){ + data = (RawTraceData*)g_list_nth_data(tmpList,i); + if(data->pid == -1 && data->cpu_id == j) data->pid = pid; + } } } } + g_array_free(pid_array,TRUE); + g_array_free(tmp_pid_array, TRUE); + //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; @@ -1570,17 +1712,23 @@ gboolean parse_event(void *hook_data, void *call_data) field = ltt_event_field(e); time = ltt_event_time(e); - if(event_viewer_data->raw_trace_data_queue_tmp->length){ - list = g_list_last(event_viewer_data->raw_trace_data_queue_tmp->head); - prev_raw_trace_data = (RawTraceData *)(list->data); - } - tmp_raw_trace_data = g_new(RawTraceData,1); tmp_raw_trace_data->cpu_id = ltt_event_cpu_id(e); tmp_raw_trace_data->event_name = g_strdup(ltt_eventtype_name(ltt_event_eventtype(e))); tmp_raw_trace_data->time = time; tmp_raw_trace_data->ep = ltt_event_position_new(); + if(event_viewer_data->raw_trace_data_queue_tmp->length){ + list = event_viewer_data->raw_trace_data_queue_tmp->head; + for(i=event_viewer_data->raw_trace_data_queue_tmp->length-1;i>=0;i--){ + data = (RawTraceData *)g_list_nth_data(list,i); + if(data->cpu_id == tmp_raw_trace_data->cpu_id){ + prev_raw_trace_data = data; + break; + } + } + } + if(prev_raw_trace_data) tmp_raw_trace_data->pid = prev_raw_trace_data->pid; else tmp_raw_trace_data->pid = -1; @@ -1599,7 +1747,9 @@ gboolean parse_event(void *hook_data, void *call_data) list = event_viewer_data->raw_trace_data_queue_tmp->head; for(i=0;iraw_trace_data_queue_tmp->length;i++){ data = (RawTraceData *)g_list_nth_data(list,i); - data->pid = out; + if(data->cpu_id == tmp_raw_trace_data->cpu_id){ + data->pid = out; + } } } }