- LttType *type;
- LttField *element;
- char *name;
- int nb, i;
-
- type = ltt_field_type(f);
- switch(ltt_type_class(type)) {
- case LTT_INT:
- g_string_append_printf(s, " %ld", ltt_event_get_long_int(e,f));
- break;
-
- case LTT_UINT:
- g_string_append_printf(s, " %lu", ltt_event_get_long_unsigned(e,f));
- break;
-
- case LTT_FLOAT:
- g_string_append_printf(s, " %g", ltt_event_get_double(e,f));
- break;
-
- case LTT_STRING:
- g_string_append_printf(s, " \"%s\"", ltt_event_get_string(e,f));
- break;
-
- case LTT_ENUM:
- g_string_append_printf(s, " %s", ltt_enum_string_get(type,
- ltt_event_get_unsigned(e,f)-1));
- break;
-
- case LTT_ARRAY:
- case LTT_SEQUENCE:
- g_string_append_printf(s, " {");
- nb = ltt_event_field_element_number(e,f);
- element = ltt_field_element(f);
- for(i = 0 ; i < nb ; i++) {
- ltt_event_field_element_select(e,f,i);
- get_event_detail(e, element, s);
- }
- g_string_append_printf(s, " }");
- break;
-
- case LTT_STRUCT:
- g_string_append_printf(s, " {");
- nb = ltt_type_member_number(type);
- for(i = 0 ; i < nb ; i++) {
- element = ltt_field_member(f,i);
- ltt_type_member_type(type, i, &name);
- g_string_append_printf(s, " %s = ", name);
- get_event_detail(e, element, s);
- }
- g_string_append_printf(s, " }");
- break;
- }
-
-}
-
-static void get_pid(unsigned * in, unsigned * out, char * s)
-{
- char * str;
- str = strstr(s, "out =");
- if (str){
- str = str + 5;
- sscanf(str,"%d", out);
- }else{
- g_warning("Can not find out pid\n");
- }
-
- str = strstr(s,"in =");
- if (str){
- str = str + 4;
- sscanf(str,"%d", in);
- }else{
- g_warning("Can not find in pid\n");
- }
-}
-
-gboolean parse_event(void *hook_data, void *call_data)
-{
- EventViewerData *event_viewer_data = (EventViewerData *)hook_data;
- LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
- LttvTracefileState *tfs = (LttvTracefileState *)call_data;
-
- RawTraceData * tmp_raw_trace_data,*prev_raw_trace_data = NULL, *data=NULL;
- LttEvent *e;
- LttTime time;
- LttField * field;
- unsigned in=0, out=0;
- int i;
- GString * detail_event = g_string_new("");
- GList * list;
-
- e = tfc->e;
- field = ltt_event_field(e);
- time = ltt_event_time(e);
-
- 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;
-
- tmp_raw_trace_data->entry_length = field == NULL ? 0 : ltt_field_size(field);
- if(field) get_event_detail(e, field, detail_event);
- tmp_raw_trace_data->event_description = g_strdup(detail_event->str);
-
- if(strcmp(tmp_raw_trace_data->event_name, "schedchange") == 0){
- get_pid(&in, &out, detail_event->str);
- }
-
-
- if(in != 0 || out != 0){
- tmp_raw_trace_data->pid = in;
- if(prev_raw_trace_data && prev_raw_trace_data->pid == -1){
- 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);
- if(data->cpu_id == tmp_raw_trace_data->cpu_id){
- data->pid = out;
- }
- }
- }
- }
-
- ltt_event_position(e, tmp_raw_trace_data->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,tmp_raw_trace_data);
- }else{
- g_free(tmp_raw_trace_data);
- }
- }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,tmp_raw_trace_data);