struct trace_descriptor *ctf_open_trace(const char *path, int flags);
void ctf_close_trace(struct trace_descriptor *descriptor);
-static rw_dispatch read_dispatch_table[] = {
+static
+rw_dispatch read_dispatch_table[] = {
[ CTF_TYPE_INTEGER ] = ctf_integer_read,
[ CTF_TYPE_FLOAT ] = ctf_float_read,
[ CTF_TYPE_ENUM ] = ctf_enum_read,
[ CTF_TYPE_SEQUENCE ] = ctf_sequence_rw,
};
-static rw_dispatch write_dispatch_table[] = {
+static
+rw_dispatch write_dispatch_table[] = {
[ CTF_TYPE_INTEGER ] = ctf_integer_write,
[ CTF_TYPE_FLOAT ] = ctf_float_write,
[ CTF_TYPE_ENUM ] = ctf_enum_write,
[ CTF_TYPE_SEQUENCE ] = ctf_sequence_rw,
};
+static
struct format ctf_format = {
.open_trace = ctf_open_trace,
.close_trace = ctf_close_trace,
};
-void ctf_init_pos(struct ctf_stream_pos *pos, int fd)
+void ctf_init_pos(struct ctf_stream_pos *pos, int fd, int open_flags)
{
pos->fd = fd;
pos->mmap_offset = 0;
pos->base = NULL;
pos->offset = 0;
pos->dummy = false;
- pos->packet_index = g_array_new(FALSE, TRUE,
- sizeof(struct packet_index));
pos->cur_index = 0;
- if (fd >= 0) {
- int flags = fcntl(fd, F_GETFL, 0);
-
- switch (flags & O_ACCMODE) {
- case O_RDONLY:
- pos->prot = PROT_READ;
- pos->flags = MAP_PRIVATE;
- pos->parent.rw_table = read_dispatch_table;
- break;
- case O_WRONLY:
- case O_RDWR:
- pos->prot = PROT_WRITE; /* Write has priority */
- pos->flags = MAP_SHARED;
- pos->parent.rw_table = write_dispatch_table;
+ if (fd >= 0)
+ pos->packet_index = g_array_new(FALSE, TRUE,
+ sizeof(struct packet_index));
+ else
+ pos->packet_index = NULL;
+ switch (open_flags & O_ACCMODE) {
+ case O_RDONLY:
+ pos->prot = PROT_READ;
+ pos->flags = MAP_PRIVATE;
+ pos->parent.rw_table = read_dispatch_table;
+ break;
+ case O_WRONLY:
+ case O_RDWR:
+ pos->prot = PROT_WRITE; /* Write has priority */
+ pos->flags = MAP_SHARED;
+ pos->parent.rw_table = write_dispatch_table;
+ if (fd >= 0)
ctf_move_pos_slow(pos, 0); /* position for write */
- break;
- default:
- assert(0);
- }
-
+ break;
+ default:
+ assert(0);
}
}
if (ret < 0)
goto error;
file_stream = g_new0(struct ctf_file_stream, 1);
- ctf_init_pos(&file_stream->pos, ret);
+ ctf_init_pos(&file_stream->pos, ret, flags);
ret = create_stream_packet_index(td, file_stream);
if (ret)
goto error_index;
for (i = 0; i < td->streams->len; i++) {
struct ctf_stream *stream;
int j;
-
stream = g_ptr_array_index(td->streams, i);
for (j = 0; j < stream->files->len; j++) {
struct ctf_file_stream *file_stream;
- file_stream = g_ptr_array_index(td->streams, j);
+ file_stream = g_ptr_array_index(stream->files, j);
ctf_close_file_stream(file_stream);
}