+int get_block_offset_size(LttTracefile *tf, guint block_num,
+ uint64_t *offset, uint32_t *size)
+{
+ uint64_t offa, offb;
+
+ if (unlikely(block_num >= tf->num_blocks))
+ return -1;
+
+ offa = g_array_index(tf->buf_index, uint64_t, block_num);
+ if (likely(block_num < tf->num_blocks - 1))
+ offb = g_array_index(tf->buf_index, uint64_t, block_num + 1);
+ else
+ offb = tf->file_size;
+ *offset = offa;
+ *size = offb - offa;
+ return 0;
+}
+
+int ltt_trace_create_block_index(LttTracefile *tf)
+{
+ int page_size = getpagesize();
+ uint64_t offset = 0;
+ unsigned long i = 0;
+ unsigned int header_map_size = PAGE_ALIGN(ltt_subbuffer_header_size());
+
+ tf->buf_index = g_array_sized_new(FALSE, TRUE, sizeof(uint64_t),
+ DEFAULT_N_BLOCKS);
+
+ g_assert(tf->buf_index->len == i);
+
+ while (offset < tf->file_size) {
+ ltt_subbuffer_header_t *header;
+ uint64_t *off;
+
+ tf->buf_index = g_array_set_size(tf->buf_index, i + 1);
+ off = &g_array_index(tf->buf_index, uint64_t, i);
+ *off = offset;
+
+ /* map block header */
+ header = mmap(0, header_map_size, PROT_READ,
+ MAP_PRIVATE, tf->fd, (off_t)offset);
+ if(header == MAP_FAILED) {
+ perror("Error in allocating memory for buffer of tracefile");
+ return -1;
+ }
+
+ /* read len, offset += len */
+ offset += ltt_get_uint32(LTT_GET_BO(tf), &header->sb_size);
+
+ /* unmap block header */
+ if(munmap(header, header_map_size)) {
+ g_warning("unmap size : %u\n", header_map_size);
+ perror("munmap error");
+ return -1;
+ }
+ ++i;
+ }
+ tf->num_blocks = i;