X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=include%2Fbabeltrace%2Fctf%2Fmetadata.h;h=de1a70d101b921975a5f10fb23b183ff9e558adb;hp=7923e65b48ae4fef7c31570063458d9c8294fb05;hb=aa6bffaea450106c60fc1292152bd94a270fd243;hpb=fe21b9435361899060af5ec3b42f2778b4dfbcdd diff --git a/include/babeltrace/ctf/metadata.h b/include/babeltrace/ctf/metadata.h index 7923e65b..de1a70d1 100644 --- a/include/babeltrace/ctf/metadata.h +++ b/include/babeltrace/ctf/metadata.h @@ -20,41 +20,156 @@ */ #include +#include +#include +#include +#include +#include +#include #include +#define CTF_MAGIC 0xC1FC1FC1 + struct ctf_trace; -struct ctf_stream; +struct ctf_stream_class; struct ctf_event; +struct ctf_file_stream { + uint64_t stream_id; + struct ctf_stream_class *stream; + struct ctf_stream_pos pos; /* current stream position */ +}; + +#define CTF_TRACE_SET_FIELD(ctf_trace, field) \ + do { \ + (ctf_trace)->field_mask |= CTF_TRACE_ ## field; \ + } while (0) + +#define CTF_TRACE_FIELD_IS_SET(ctf_trace, field) \ + ((ctf_trace)->field_mask & CTF_TRACE_ ## field) + +#define CTF_TRACE_GET_FIELD(ctf_trace, field) \ + ({ \ + assert(CTF_TRACE_FIELD_IS_SET(ctf_trace, field)); \ + (ctf_trace)->(field); \ + }) + + struct ctf_trace { - struct declaration_scope *scope; /* root scope */ - GArray *streams; /* Array of struct ctf_stream */ + struct trace_descriptor parent; + /* root scope */ + struct declaration_scope *root_declaration_scope; + + struct declaration_scope *declaration_scope; + /* innermost definition scope. to be used as parent of stream. */ + struct definition_scope *definition_scope; + GPtrArray *streams; /* Array of struct ctf_stream_class pointers */ + struct ctf_file_stream metadata; + + /* Declarations only used when parsing */ + struct declaration_struct *packet_header_decl; + + /* Definitions used afterward */ + struct definition_struct *packet_header; uint64_t major; uint64_t minor; - uint8_t uuid[16]; - uint64_t word_size; + uuid_t uuid; + int byte_order; /* trace BYTE_ORDER. 0 if unset. */ + + enum { /* Fields populated mask */ + CTF_TRACE_major = (1U << 0), + CTF_TRACE_minor = (1U << 1), + CTF_TRACE_uuid = (1U << 2), + CTF_TRACE_byte_order = (1U << 3), + CTF_TRACE_packet_header = (1U << 4), + } field_mask; + + /* Information about trace backing directory and files */ + DIR *dir; + int dirfd; + int flags; /* open flags */ }; -struct ctf_stream { - struct declaration_scope *scope; /* parent is trace scope */ - GArray *events_by_id; /* Array of struct ctf_event indexed by id */ - GHashTable *event_quark_to_id; /* GQuark to numeric id */ +#define CTF_STREAM_SET_FIELD(ctf_stream, field) \ + do { \ + (ctf_stream)->field_mask |= CTF_STREAM_ ## field; \ + } while (0) + +#define CTF_STREAM_FIELD_IS_SET(ctf_stream, field) \ + ((ctf_stream)->field_mask & CTF_STREAM_ ## field) + +#define CTF_STREAM_GET_FIELD(ctf_stream, field) \ + ({ \ + assert(CTF_STREAM_FIELD_IS_SET(ctf_stream, field)); \ + (ctf_stream)->(field); \ + }) + +struct ctf_stream_class { + struct ctf_trace *trace; + /* parent is lexical scope conaining the stream scope */ + struct declaration_scope *declaration_scope; + /* innermost definition scope. to be used as parent of event. */ + struct definition_scope *definition_scope; + GPtrArray *events_by_id; /* Array of struct ctf_event pointers indexed by id */ + GHashTable *event_quark_to_id; /* GQuark to numeric id */ + + /* Declarations only used when parsing */ + struct declaration_struct *packet_context_decl; + struct declaration_struct *event_header_decl; + struct declaration_struct *event_context_decl; + + /* Definitions used afterward */ + struct definition_struct *packet_context; + struct definition_struct *event_header; + struct definition_struct *event_context; uint64_t stream_id; - struct declaration_struct *event_header; - struct declaration_struct *event_context; - struct declaration_struct *packet_context; + + enum { /* Fields populated mask */ + CTF_STREAM_stream_id = (1 << 0), + } field_mask; + + GPtrArray *files; /* Array of struct ctf_file_stream pointers */ }; +#define CTF_EVENT_SET_FIELD(ctf_event, field) \ + do { \ + (ctf_event)->field_mask |= CTF_EVENT_ ## field; \ + } while (0) + +#define CTF_EVENT_FIELD_IS_SET(ctf_event, field) \ + ((ctf_event)->field_mask & CTF_EVENT_ ## field) + +#define CTF_EVENT_GET_FIELD(ctf_event, field) \ + ({ \ + assert(CTF_EVENT_FIELD_IS_SET(ctf_event, field)); \ + (ctf_event)->(field); \ + }) struct ctf_event { - struct declaration_scope *scope; /* parent is stream scope */ + /* stream mapped by stream_id */ + struct ctf_stream_class *stream; + /* parent is lexical scope conaining the event scope */ + struct declaration_scope *declaration_scope; + + /* Declarations only used when parsing */ + struct declaration_struct *context_decl; + struct declaration_struct *fields_decl; + + /* Definitions used afterward */ + struct definition_struct *context; + struct definition_struct *fields; + GQuark name; - uint64_t id; /* Numeric identifier within the stream */ + uint64_t id; /* Numeric identifier within the stream */ uint64_t stream_id; - struct declaration_struct *context; - struct declaration_struct *fields; + + enum { /* Fields populated mask */ + CTF_EVENT_name = (1 << 0), + CTF_EVENT_id = (1 << 1), + CTF_EVENT_stream_id = (1 << 2), + } field_mask; }; #endif /* _BABELTRACE_CTF_METADATA_H */