X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2FguiEvents.c;h=89df4511e19276abd86f36e269c388e0b322f7bf;hb=bd24a9afb2b7ab792a7de77a2226009fd746ac18;hp=078314dd013bdf2d598c92005b2b2f600ba16721;hpb=ed3b99b601fb95fea1f2c4e8718a0a94233929f2;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/guiEvents.c b/ltt/branches/poly/lttv/modules/guiEvents.c index 078314dd..89df4511 100644 --- a/ltt/branches/poly/lttv/modules/guiEvents.c +++ b/ltt/branches/poly/lttv/modules/guiEvents.c @@ -65,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, @@ -800,6 +802,35 @@ gboolean show_event_detail(void * hook_data, void * call_data) return FALSE; } +void insert_data_into_model(EventViewerData *event_viewer_data, int start, int end) +{ + int i; + guint64 real_data; + RawTraceData * raw_data; + GList * first; + GtkTreeIter iter; + + first = event_viewer_data->raw_trace_data_queue->head; + for(i=start; i=event_viewer_data->number_of_events) break; + raw_data = (RawTraceData*)g_list_nth_data(first, i); + + // 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, real_data, + PID_COLUMN, raw_data->pid, + ENTRY_LEN_COLUMN, raw_data->entry_length, + EVENT_DESCR_COLUMN, raw_data->event_description, + -1); + } +} + void get_test_data(double time_value, guint list_height, EventViewerData *event_viewer_data) { @@ -876,7 +907,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); @@ -887,7 +918,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){ @@ -899,7 +930,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; @@ -933,15 +964,19 @@ void get_test_data(double time_value, guint list_height, end.tv_nsec = G_MAXULONG; get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE, &size); if(size == 0){ - get_events(event_viewer_data, start, end, G_MAXULONG, &size); + 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); } - }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) 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: 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; @@ -952,13 +987,16 @@ void get_test_data(double time_value, guint list_height, end.tv_nsec = G_MAXULONG; get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE,&size); if(size == 0){ - get_events(event_viewer_data, start, end, G_MAXULONG,&size); + 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(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; + 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; @@ -985,14 +1023,16 @@ 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*RESERVE_SMALL_SIZE,&size); + 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; @@ -1036,39 +1076,7 @@ void get_test_data(double time_value, guint list_height, goto LAST; }else gtk_widget_show(event_viewer_data->vscroll_vc); - for(i=event_number; i=event_viewer_data->number_of_events) break; - - raw_data = (RawTraceData*)g_list_nth_data(first, i); - - // 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, 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", - TIME_COLUMN, i, - PID_COLUMN, 100, - ENTRY_LEN_COLUMN, 17, - EVENT_DESCR_COLUMN, "Detailed information", - -1); -*/ - } + insert_data_into_model(event_viewer_data,event_number, event_number+list_height); } #ifdef DEBUG //do not use this, it's slower and broken // } else { @@ -1406,16 +1414,22 @@ gboolean update_current_time(void * hook_data, void * call_data) + event_viewer_data->current_time.tv_nsec; GtkTreeIter iter; guint64 time; - int count = 0; + int count = -1; GtkTreeModel* model = (GtkTreeModel*)event_viewer_data->store_m; + GList * list; + RawTraceData * data, *data1; + GtkTreePath* path; + char str_path[64]; + int i, j; - + //check if the event is shown in the current viewer if(gtk_tree_model_get_iter_first(model, &iter)){ while(1){ gtk_tree_model_get(model, &iter, TIME_COLUMN, &time, -1); if(time < nsec){ if(!gtk_tree_model_iter_next(model, &iter)){ - return TRUE; + count = -1; + break; } count++; }else{ @@ -1425,6 +1439,47 @@ gboolean update_current_time(void * hook_data, void * call_data) // event_selected_hook(event_viewer_data, &count); } + //the event is not shown in the current viewer + if(count == -1){ + count = 0; + //check if the event is in the buffer + list = event_viewer_data->raw_trace_data_queue->head; + data = (RawTraceData*)g_list_nth_data(list,0); + data1 = (RawTraceData*)g_list_nth_data(list,event_viewer_data->raw_trace_data_queue->length-1); + + //the event is in the buffer + if(ltt_time_compare(data->time, event_viewer_data->current_time)<=0 && + ltt_time_compare(data1->time, event_viewer_data->current_time)>=0){ + for(i=0;iraw_trace_data_queue->length;i++){ + data = (RawTraceData*)g_list_nth_data(list,i); + if(ltt_time_compare(data->time, event_viewer_data->current_time) < 0){ + count++; + continue; + } + break; + } + if(event_viewer_data->raw_trace_data_queue->length-count < event_viewer_data->num_visible_events){ + j = event_viewer_data->raw_trace_data_queue->length - event_viewer_data->num_visible_events; + count -= j; + }else{ + j = count; + count = 0; + } + insert_data_into_model(event_viewer_data,j, j+event_viewer_data->num_visible_events); + }else{//the event is not in the buffer + LttTime start = ltt_time_sub(event_viewer_data->current_time, event_viewer_data->time_span.startTime); + double position = ltt_time_to_double(start) * NANOSECONDS_PER_SECOND; + get_test_data(position, + event_viewer_data->num_visible_events, + event_viewer_data); + } + } + + sprintf(str_path,"%d\0",count); + path = gtk_tree_path_new_from_string (str_path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(event_viewer_data->tree_v), path, NULL, FALSE); + gtk_tree_path_free(path); + return FALSE; } @@ -1457,8 +1512,12 @@ void update_raw_data_array(EventViewerData* event_viewer_data, unsigned size) { RawTraceData * data; if(size > 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){ @@ -1471,30 +1530,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;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++){ 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; @@ -1632,17 +1756,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; @@ -1661,7 +1791,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; + } } } }