#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
-#include <stdbool.h>
#include <glib.h>
#include <inttypes.h>
#include "compat/mman.h"
static inline
size_t remaining_mmap_bytes(struct ctf_fs_ds_file *ds_file)
{
- BT_ASSERT(ds_file->mmap_len >= ds_file->request_offset);
+ BT_ASSERT_DBG(ds_file->mmap_len >= ds_file->request_offset);
return ds_file->mmap_len - ds_file->request_offset;
}
if (whence != BT_MSG_ITER_SEEK_WHENCE_SET ||
offset < 0 || offset > file_size) {
BT_COMP_LOGE("Invalid medium seek request: whence=%d, offset=%jd, "
- "file-size=%jd", (int) whence, offset,
- file_size);
+ "file-size=%jd", (int) whence, (intmax_t) offset,
+ (intmax_t) file_size);
ret = BT_MSG_ITER_MEDIUM_STATUS_INVAL;
goto end;
}
int unmap_ret;
BT_COMP_LOGD("Medium seek request cannot be accomodated by the current "
"file mapping: offset=%jd, mmap-offset=%jd, "
- "mmap-len=%zu", offset, ds_file->mmap_offset,
+ "mmap-len=%zu", (intmax_t) offset, (intmax_t) ds_file->mmap_offset,
ds_file->mmap_len);
unmap_ret = ds_file_munmap(ds_file);
if (unmap_ret) {
map_requested_offset:
offset_in_mapping = offset %
- bt_common_get_page_size(ds_file->log_level);
+ bt_mmap_get_offset_align_size(ds_file->log_level);
ds_file->mmap_offset = offset - offset_in_mapping;
ds_file->request_offset = offset_in_mapping;
static
struct ctf_fs_ds_index *build_index_from_idx_file(
- struct ctf_fs_ds_file *ds_file)
+ struct ctf_fs_ds_file *ds_file,
+ struct ctf_fs_ds_file_info *file_info)
{
int ret;
gchar *directory = NULL;
goto error;
}
+ /* Set path to stream file. */
+ index_entry->path = file_info->path->str;
+
/* Convert size in bits to bytes. */
packet_size /= CHAR_BIT;
index_entry->packet_size = packet_size;
total_packets_size += packet_size;
file_pos += file_index_entry_size;
- g_ptr_array_add(index->entries, index_entry);
prev_index_entry = index_entry;
+
+ /* Give ownership of `index_entry` to `index->entries`. */
+ g_ptr_array_add(index->entries, index_entry);
+ index_entry = NULL;
}
/* Validate that the index addresses the complete stream. */
entry->packet_size = packet_size;
if (props->snapshots.beginning_clock != UINT64_C(-1)) {
+ entry->timestamp_begin = props->snapshots.beginning_clock;
+
/* Convert the packet's bound to nanoseconds since Epoch. */
ret = convert_cycles_to_ns(sc->default_clock_class,
props->snapshots.beginning_clock,
goto end;
}
} else {
+ entry->timestamp_begin = UINT64_C(-1);
entry->timestamp_begin_ns = UINT64_C(-1);
}
if (props->snapshots.end_clock != UINT64_C(-1)) {
+ entry->timestamp_end = props->snapshots.end_clock;
+
+ /* Convert the packet's bound to nanoseconds since Epoch. */
ret = convert_cycles_to_ns(sc->default_clock_class,
props->snapshots.end_clock,
&entry->timestamp_end_ns);
goto end;
}
} else {
+ entry->timestamp_end = UINT64_C(-1);
entry->timestamp_end_ns = UINT64_C(-1);
}
static
struct ctf_fs_ds_index *build_index_from_stream_file(
- struct ctf_fs_ds_file *ds_file)
+ struct ctf_fs_ds_file *ds_file,
+ struct ctf_fs_ds_file_info *file_info)
{
int ret;
struct ctf_fs_ds_index *index = NULL;
goto error;
}
- do {
+ while (true) {
off_t current_packet_size_bytes;
struct ctf_fs_ds_index_entry *index_entry;
struct bt_msg_iter_packet_properties props;
"packet-offset=%jd, packet-size-bytes=%jd, "
"file-size=%jd",
ds_file->file->path->str,
- current_packet_offset_bytes,
- current_packet_size_bytes,
- ds_file->file->size);
+ (intmax_t) current_packet_offset_bytes,
+ (intmax_t) current_packet_size_bytes,
+ (intmax_t) ds_file->file->size);
goto error;
}
goto error;
}
+ /* Set path to stream file. */
+ index_entry->path = file_info->path->str;
+
ret = init_index_entry(index_entry, ds_file, &props,
current_packet_size_bytes, current_packet_offset_bytes);
if (ret) {
current_packet_offset_bytes += current_packet_size_bytes;
BT_COMP_LOGD("Seeking to next packet: current-packet-offset=%jd, "
"next-packet-offset=%jd",
- current_packet_offset_bytes - current_packet_size_bytes,
- current_packet_offset_bytes);
-
- } while (iter_status == BT_MSG_ITER_STATUS_OK);
-
- if (iter_status != BT_MSG_ITER_STATUS_OK) {
- goto error;
+ (intmax_t) (current_packet_offset_bytes - current_packet_size_bytes),
+ (intmax_t) current_packet_offset_bytes);
}
end:
bt_logging_level log_level)
{
int ret;
- const size_t page_size = bt_common_get_page_size(log_level);
+ const size_t offset_align = bt_mmap_get_offset_align_size(log_level);
struct ctf_fs_ds_file *ds_file = g_new0(struct ctf_fs_ds_file, 1);
if (!ds_file) {
ds_file->log_level = log_level;
ds_file->self_comp = ctf_fs_trace->self_comp;
- ds_file->pc_msg_iter = pc_msg_iter;
+ ds_file->self_msg_iter = pc_msg_iter;
ds_file->file = ctf_fs_file_create(log_level, ds_file->self_comp);
if (!ds_file->file) {
goto error;
goto error;
}
- ds_file->mmap_max_len = page_size * 2048;
+ ds_file->mmap_max_len = offset_align * 2048;
goto end;
BT_HIDDEN
struct ctf_fs_ds_index *ctf_fs_ds_file_build_index(
- struct ctf_fs_ds_file *ds_file)
+ struct ctf_fs_ds_file *ds_file,
+ struct ctf_fs_ds_file_info *file_info)
{
struct ctf_fs_ds_index *index;
- index = build_index_from_idx_file(ds_file);
+ index = build_index_from_idx_file(ds_file, file_info);
if (index) {
goto end;
}
BT_COMP_LOGI("Failed to build index from .index file; "
"falling back to stream indexing.");
- index = build_index_from_stream_file(ds_file);
+ index = build_index_from_stream_file(ds_file, file_info);
end:
return index;
}
bt_component_class_message_iterator_next_method_status status;
msg_iter_status = bt_msg_iter_get_next_message(
- ds_file->msg_iter, ds_file->pc_msg_iter, msg);
+ ds_file->msg_iter, ds_file->self_msg_iter, msg);
switch (msg_iter_status) {
case BT_MSG_ITER_STATUS_EOF:
* medium-specific; there is nothing for the user to do
* and it should have been handled upstream.
*/
- abort();
+ bt_common_abort();
case BT_MSG_ITER_STATUS_INVAL:
case BT_MSG_ITER_STATUS_ERROR:
default: