X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=plugins%2Fctf%2Ffs-src%2Fdata-stream-file.h;h=a0ac6c7423d4c1388a2e80f33592aa4ae1abb813;hb=40f4ba76dd6f9508ca51b6220eaed57632281a07;hp=e5bc7c76591d06b339046e6a140c18b840b9a411;hpb=94cf822ec0adbb6d6d33d6475c5b58e1dd7e2b79;p=babeltrace.git diff --git a/plugins/ctf/fs-src/data-stream-file.h b/plugins/ctf/fs-src/data-stream-file.h index e5bc7c76..a0ac6c74 100644 --- a/plugins/ctf/fs-src/data-stream-file.h +++ b/plugins/ctf/fs-src/data-stream-file.h @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include "../common/notif-iter/notif-iter.h" #include "lttng-index.h" @@ -37,34 +37,122 @@ struct ctf_fs_file; struct ctf_fs_trace; struct ctf_fs_ds_file; -struct index_entry { - uint64_t offset; /* in bytes. */ - uint64_t packet_size; /* in bytes. */ - /* relative to the packet context field's mapped clock. */ +struct ctf_fs_ds_index_entry { + /* Position, in bytes, of the packet from the beginning of the file. */ + uint64_t offset; + + /* Size of the packet, in bytes. */ + uint64_t packet_size; + + /* + * Extracted from the packet context, relative to the respective fields' + * mapped clock classes (in cycles). + */ uint64_t timestamp_begin, timestamp_end; + + /* + * Converted from the packet context, relative to the trace's EPOCH + * (in ns since EPOCH). + */ + int64_t timestamp_begin_ns, timestamp_end_ns; }; -struct index { - GArray *entries; /* Array of struct index_entry. */ +struct ctf_fs_ds_index { + /* Array of struct ctf_fs_fd_index_entry. */ + GArray *entries; +}; + +struct ctf_fs_ds_file_info { + /* + * Owned by this. May be NULL. + * + * A stream cannot be assumed to be indexed as the indexing might have + * been skipped. Moreover, the index's fields may not all be available + * depending on the producer (e.g. timestamp_begin/end are not + * mandatory). + * + * FIXME In such cases (missing fields), the indexing is aborted as + * no the index entries don't have a concept of fields being present + * or not. + */ + struct ctf_fs_ds_index *index; + + /* Owned by this. */ + GString *path; + + /* Guaranteed to be set, as opposed to the index. */ + int64_t begin_ns; +}; + +struct ctf_fs_metadata; + +struct ctf_fs_ds_file { + /* Weak */ + struct ctf_fs_metadata *metadata; + + /* Weak */ + struct bt_self_notification_iterator *pc_notif_iter; + + /* Owned by this */ + struct ctf_fs_file *file; + + /* Owned by this */ + struct bt_stream *stream; + + /* Weak */ + struct bt_notif_iter *notif_iter; + + void *mmap_addr; + + /* + * Max length of chunk to mmap() when updating the current mapping. + * This value must be page-aligned. + */ + size_t mmap_max_len; + + /* Length of the current mapping. Never exceeds the file's length. */ + size_t mmap_len; + + /* Offset in the file where the current mapping starts. */ + off_t mmap_offset; + + /* + * Offset, in the current mapping, of the address to return on the next + * request. + */ + off_t request_offset; + + bool end_reached; }; BT_HIDDEN struct ctf_fs_ds_file *ctf_fs_ds_file_create( struct ctf_fs_trace *ctf_fs_trace, - struct bt_ctf_stream *stream, const char *path, - bool build_index); + struct bt_self_notification_iterator *pc_notif_iter, + struct bt_notif_iter *notif_iter, + struct bt_stream *stream, const char *path); BT_HIDDEN -int ctf_fs_ds_file_get_packet_header_context_fields( - struct ctf_fs_trace *ctf_fs_trace, const char *path, - struct bt_ctf_field **packet_header_field, - struct bt_ctf_field **packet_context_field); +int ctf_fs_ds_file_borrow_packet_header_context_fields( + struct ctf_fs_ds_file *ds_file, + struct bt_field **packet_header_field, + struct bt_field **packet_context_field); BT_HIDDEN void ctf_fs_ds_file_destroy(struct ctf_fs_ds_file *stream); BT_HIDDEN -struct bt_notification_iterator_next_return ctf_fs_ds_file_next( - struct ctf_fs_ds_file *stream); +enum bt_notification_iterator_status ctf_fs_ds_file_next( + struct ctf_fs_ds_file *ds_file, + struct bt_private_notification **notif); + +BT_HIDDEN +struct ctf_fs_ds_index *ctf_fs_ds_file_build_index( + struct ctf_fs_ds_file *ds_file); + +BT_HIDDEN +void ctf_fs_ds_index_destroy(struct ctf_fs_ds_index *index); + +extern struct bt_notif_iter_medium_ops ctf_fs_ds_file_medops; #endif /* CTF_FS_DS_FILE_H */