X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ftracefile.c;h=fc1f4583d009a732982d96d94a8cd57bb418eb6d;hb=826f1ab264718e5e4c6b101557cd205422d3d20b;hp=6b027c4fc02182249a4af874bcc8f9494df1f4f8;hpb=69bd59ed20497e8453727155aa54c9b515e1c3ab;p=lttv.git diff --git a/ltt/branches/poly/ltt/tracefile.c b/ltt/branches/poly/ltt/tracefile.c index 6b027c4f..fc1f4583 100644 --- a/ltt/branches/poly/ltt/tracefile.c +++ b/ltt/branches/poly/ltt/tracefile.c @@ -76,11 +76,6 @@ GQuark LTT_TRACEFILE_NAME_FACILITIES; #define PAGE_MASK (~(page_size-1)) #define PAGE_ALIGN(addr) (((addr)+page_size-1)&PAGE_MASK) -/* obtain the time of an event */ - -static inline LttTime getEventTime(LttTracefile * tf); - - /* set the offset of the fields belonging to the event, need the information of the archecture */ void set_fields_offsets(LttTracefile *tf, LttEventType *event_type); @@ -251,10 +246,16 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) //store the size of the file tf->file_size = lTDFStat.st_size; - tf->block_size = ltt_get_uint32(LTT_GET_BO(tf), &header->buf_size); - tf->num_blocks = tf->file_size / tf->block_size; - - munmap(tf->buffer.head, PAGE_ALIGN(sizeof(struct ltt_block_start_header))); + tf->buf_size = ltt_get_uint32(LTT_GET_BO(tf), &header->buf_size); + tf->num_blocks = tf->file_size / tf->buf_size; + + if(munmap(tf->buffer.head, + PAGE_ALIGN(sizeof(struct ltt_block_start_header)))) { + g_warning("unmap size : %u\n", + PAGE_ALIGN(sizeof(struct ltt_block_start_header))); + perror("munmap error"); + g_assert(0); + } tf->buffer.head = NULL; //read the first block @@ -267,7 +268,13 @@ gint ltt_tracefile_open(LttTrace *t, gchar * fileName, LttTracefile *tf) /* Error */ unmap_file: - munmap(tf->buffer.head, PAGE_ALIGN(sizeof(struct ltt_block_start_header))); + if(munmap(tf->buffer.head, + PAGE_ALIGN(sizeof(struct ltt_block_start_header)))) { + g_warning("unmap size : %u\n", + PAGE_ALIGN(sizeof(struct ltt_block_start_header))); + perror("munmap error"); + g_assert(0); + } close_file: close(tf->fd); end: @@ -356,8 +363,16 @@ gint ltt_tracefile_open_control(LttTrace *t, gchar * control_name) void ltt_tracefile_close(LttTracefile *t) { + int page_size = getpagesize(); + if(t->buffer.head != NULL) - munmap(t->buffer.head, t->buf_size); + if(munmap(t->buffer.head, PAGE_ALIGN(t->buf_size))) { + g_warning("unmap size : %u\n", + PAGE_ALIGN(t->buf_size)); + perror("munmap error"); + g_assert(0); + } + close(t->fd); } @@ -520,7 +535,6 @@ int get_tracefile_name_number(const gchar *raw_name, { guint raw_name_len = strlen(raw_name); gchar char_name[PATH_MAX]; - gchar *digit_begin; int i; int underscore_pos; long int cpu_num; @@ -669,8 +683,6 @@ static int open_tracefiles(LttTrace *trace, gchar *root_path, GQuark name; guint num; GArray *group; - LttTracefile *tf; - guint len; if(get_tracefile_name_number(rel_path, &name, &num)) continue; /* invalid name */ @@ -939,7 +951,6 @@ static int ltt_process_facility_tracefile(LttTracefile *tf) return 0; /* Error handling */ -facility_error: event_id_error: fac_id_error: update_error: @@ -966,8 +977,10 @@ LttTrace *ltt_trace_open(const gchar *pathname) /* Open all the tracefiles */ g_datalist_init(&t->tracefiles); - if(open_tracefiles(t, abs_path, "")) + if(open_tracefiles(t, abs_path, "")) { + g_warning("Error opening tracefile %s", abs_path); goto open_error; + } /* Prepare the facilities containers : array and mapping */ /* Array is zeroed : the "exists" field is set to false by default */ @@ -1021,7 +1034,7 @@ alloc_error: } -GQuark ltt_trace_name(LttTrace *t) +GQuark ltt_trace_name(const LttTrace *t) { return t->pathname; } @@ -1135,7 +1148,6 @@ LttTracefile *ltt_trace_find_tracefile(LttTrace *t, const gchar *name) static void ltt_tracefile_time_span_get(LttTracefile *tf, LttTime *start, LttTime *end) { - struct ltt_block_start_header * header; int err; err = map_block(tf, 0); @@ -1307,7 +1319,7 @@ int ltt_tracefile_seek_time(LttTracefile *tf, LttTime time) else if(ret) goto fail; if(ltt_time_compare(time, tf->event.event_time) >= 0) - break; + goto found; } } else if(ltt_time_compare(time, tf->buffer.begin.timestamp) < 0) { @@ -1364,11 +1376,12 @@ int ltt_tracefile_seek_position(LttTracefile *tf, const LttEventPosition *ep) { err = ltt_tracefile_read_op(tf); if(err) goto fail; - return; + return 0; fail: g_error("ltt_tracefile_seek_time failed on tracefile %s", g_quark_to_string(tf->name)); + return 1; } /* Calculate the real event time based on the buffer boundaries */ @@ -1403,7 +1416,8 @@ LttEvent *ltt_tracefile_get_event(LttTracefile *tf) *Return value * * Returns 0 if an event can be used in tf->event. - * Returns ERANGE on end of trace. The event in tf->event still can be used. + * Returns ERANGE on end of trace. The event in tf->event still can be used + * (if the last block was not empty). * Returns EPERM on error. * * This function does make the tracefile event structure point to the event @@ -1463,9 +1477,6 @@ int ltt_tracefile_read_seek(LttTracefile *tf) /* do specific operation on events */ int ltt_tracefile_read_op(LttTracefile *tf) { - int err; - LttFacility *f; - void * pos; LttEvent *event; event = &tf->event; @@ -1485,8 +1496,6 @@ int ltt_tracefile_read_op(LttTracefile *tf) * event specific operation. */ int ltt_tracefile_read_update_event(LttTracefile *tf) { - int err; - LttFacility *f; void * pos; LttEvent *event; @@ -1572,14 +1581,21 @@ static gint map_block(LttTracefile * tf, guint block_num) g_assert(block_num < tf->num_blocks); - if(tf->buffer.head != NULL) - munmap(tf->buffer.head, PAGE_ALIGN(tf->buf_size)); + if(tf->buffer.head != NULL) { + if(munmap(tf->buffer.head, PAGE_ALIGN(tf->buf_size))) { + g_warning("unmap size : %u\n", + PAGE_ALIGN(tf->buf_size)); + perror("munmap error"); + g_assert(0); + } + } + /* Multiple of pages aligned head */ tf->buffer.head = mmap(0, - PAGE_ALIGN(tf->block_size), + PAGE_ALIGN(tf->buf_size), PROT_READ, MAP_PRIVATE, tf->fd, - PAGE_ALIGN((off_t)tf->block_size * (off_t)block_num)); + PAGE_ALIGN((off_t)tf->buf_size * (off_t)block_num)); if(tf->buffer.head == MAP_FAILED) { perror("Error in allocating memory for buffer of tracefile"); @@ -1596,14 +1612,14 @@ static gint map_block(LttTracefile * tf, guint block_num) tf->buffer.begin.timestamp = ltt_get_time(LTT_GET_BO(tf), &header->begin.timestamp); tf->buffer.begin.timestamp.tv_nsec *= NSEC_PER_USEC; - g_warning("block %u begin : %lu.%lu", block_num, + g_debug("block %u begin : %lu.%lu", block_num, tf->buffer.begin.timestamp.tv_sec, tf->buffer.begin.timestamp.tv_nsec); tf->buffer.begin.cycle_count = ltt_get_uint64(LTT_GET_BO(tf), &header->begin.cycle_count); tf->buffer.end.timestamp = ltt_get_time(LTT_GET_BO(tf), &header->end.timestamp); tf->buffer.end.timestamp.tv_nsec *= NSEC_PER_USEC; - g_warning("block %u end : %lu.%lu", block_num, + g_debug("block %u end : %lu.%lu", block_num, tf->buffer.end.timestamp.tv_sec, tf->buffer.end.timestamp.tv_nsec); tf->buffer.end.cycle_count = ltt_get_uint64(LTT_GET_BO(tf), &header->end.cycle_count); @@ -1616,7 +1632,7 @@ static gint map_block(LttTracefile * tf, guint block_num) /* FIXME * eventually support variable buffer size : will need a partial pre-read of * the headers to create an index when we open the trace... eventually. */ - g_assert(tf->block_size == ltt_get_uint32(LTT_GET_BO(tf), + g_assert(tf->buf_size == ltt_get_uint32(LTT_GET_BO(tf), &header->buf_size)); /* Now that the buffer is mapped, calculate the time interpolation for the @@ -1695,14 +1711,15 @@ void ltt_update_event_size(LttTracefile *tf) g_quark_to_string(tf->name)); goto event_type_error; } - + if(event_type->root_field) size = get_field_type_size(tf, event_type, 0, 0, event_type->root_field, tf->event.data); else size = 0; - g_debug("Event root field : f.e %hhu.%hhu size %lu", tf->event.facility_id, + g_debug("Event root field : f.e %hhu.%hhu size %zd", + tf->event.facility_id, tf->event.event_id, size); } @@ -1710,7 +1727,7 @@ void ltt_update_event_size(LttTracefile *tf) /* Check consistency between kernel and LTTV structure sizes */ g_assert(tf->event.data_size == tf->event.event_size); - + return; facility_error: @@ -1735,13 +1752,12 @@ static int ltt_seek_next_event(LttTracefile *tf) { int ret = 0; void *pos; - ssize_t event_size; /* seek over the buffer header if we are at the buffer start */ if(tf->event.offset == 0) { tf->event.offset += sizeof(struct ltt_block_start_header); - if(tf->event.offset == tf->block_size - tf->buffer.lost_size) { + if(tf->event.offset == tf->buf_size - tf->buffer.lost_size) { ret = ERANGE; } goto found; @@ -1756,7 +1772,7 @@ static int ltt_seek_next_event(LttTracefile *tf) tf->event.offset = pos - tf->buffer.head; - if(tf->event.offset == tf->block_size - tf->buffer.lost_size) { + if(tf->event.offset == tf->buf_size - tf->buffer.lost_size) { ret = ERANGE; goto found; } @@ -1785,14 +1801,12 @@ static double calc_nsecs_per_cycle(LttTracefile * tf) LttCycleCount lBufTotalCycle;/* Total cycles for this buffer */ /* Calculate the total time for this buffer */ - lBufTotalTime = ltt_time_sub( - ltt_get_time(LTT_GET_BO(tf), &tf->buffer.end.timestamp), - ltt_get_time(LTT_GET_BO(tf), &tf->buffer.begin.timestamp)); + lBufTotalTime = ltt_time_sub(tf->buffer.end.timestamp, + tf->buffer.begin.timestamp); /* Calculate the total cycles for this bufffer */ - lBufTotalCycle = ltt_get_uint64(LTT_GET_BO(tf), &tf->buffer.end.cycle_count); - lBufTotalCycle -= ltt_get_uint64(LTT_GET_BO(tf), - &tf->buffer.begin.cycle_count); + lBufTotalCycle = tf->buffer.end.cycle_count; + lBufTotalCycle -= tf->buffer.begin.cycle_count; /* Convert the total time to double */ lBufTotalNSec = ltt_time_to_double(lBufTotalTime); @@ -2009,7 +2023,6 @@ gint check_fields_compatibility(LttEventType *event_type1, LttField *field1, LttField *field2) { guint different = 0; - enum field_status local_fixed_root, local_fixed_parent; guint i; LttType *type1; LttType *type2; @@ -2035,11 +2048,6 @@ gint check_fields_compatibility(LttEventType *event_type1, type1 = field1->field_type; type2 = field2->field_type; - size_t current_root_offset; - size_t current_offset; - enum field_status current_child_status, final_child_status; - size_t max_size; - if(type1->type_class != type2->type_class) { different = 1; goto end;