Add trace:domain,trace:procname,trace:pid support
[babeltrace.git] / formats / ctf-text / ctf-text.c
index f1ddbaf5e77b18f2f3855d9f7f2d23a708efe949..9b5f98be1a23bd6d90104f836e9ea20977dbb291 100644 (file)
 #include <unistd.h>
 #include <stdlib.h>
 
-struct trace_descriptor *ctf_text_open_trace(const char *path, int flags);
+int opt_all_field_names,
+       opt_scope_field_names,
+       opt_header_field_names,
+       opt_context_field_names,
+       opt_payload_field_names,
+       opt_trace_name,
+       opt_trace_domain,
+       opt_trace_procname,
+       opt_trace_vpid;
+
+enum field_item {
+       ITEM_SCOPE,
+       ITEM_HEADER,
+       ITEM_CONTEXT,
+       ITEM_PAYLOAD,
+};
+
+struct trace_descriptor *ctf_text_open_trace(const char *collection_path,
+               const char *path, int flags,
+               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+                       int whence), FILE *metadata_fp);
 void ctf_text_close_trace(struct trace_descriptor *descriptor);
 
 static
@@ -92,6 +112,40 @@ int print_field(struct definition *definition)
        return 1;
 }
 
+static
+void set_field_names_print(struct ctf_text_stream_pos *pos, enum field_item item)
+{
+       switch (item) {
+       case ITEM_SCOPE:
+               if (opt_all_field_names || opt_scope_field_names)
+                       pos->print_names = 1;
+               else
+                       pos->print_names = 0;
+               break;
+       case ITEM_HEADER:
+               if (opt_all_field_names || opt_header_field_names)
+                       pos->print_names = 1;
+               else
+                       pos->print_names = 0;
+               break;
+       case ITEM_CONTEXT:
+               if (opt_all_field_names || opt_context_field_names)
+                       pos->print_names = 1;
+               else
+                       pos->print_names = 0;
+               break;
+       case ITEM_PAYLOAD:
+               if (opt_all_field_names || opt_payload_field_names)
+                       pos->print_names = 1;
+               else
+                       pos->print_names = 0;
+
+               break;
+       default:
+               assert(0);
+       }
+}
+
 static
 int ctf_text_write_event(struct stream_pos *ppos,
                         struct ctf_stream *stream)
@@ -104,6 +158,7 @@ int ctf_text_write_event(struct stream_pos *ppos,
        struct ctf_stream_event *event;
        uint64_t id;
        int ret;
+       int dom_print = 0;
 
        id = stream->event_id;
 
@@ -123,6 +178,7 @@ int ctf_text_write_event(struct stream_pos *ppos,
        }
 
        if (stream->has_timestamp) {
+               set_field_names_print(pos, ITEM_HEADER);
                if (pos->print_names)
                        fprintf(pos->fp, "timestamp = ");
                else
@@ -136,6 +192,61 @@ int ctf_text_write_event(struct stream_pos *ppos,
                else
                        fprintf(pos->fp, " ");
        }
+       if ((opt_trace_name || opt_all_field_names) && stream_class->trace->path[0] != '\0') {
+               set_field_names_print(pos, ITEM_HEADER);
+               if (pos->print_names) {
+                       if (opt_trace_name || opt_all_field_names)
+                               fprintf(pos->fp, "trace = ");
+               }
+
+               fprintf(pos->fp, "%s", stream_class->trace->path);
+               if (pos->print_names)
+                       fprintf(pos->fp, ", ");
+               else
+                       fprintf(pos->fp, " ");
+       }
+       if ((opt_trace_domain) && stream_class->trace->domain[0] != '\0') {
+               set_field_names_print(pos, ITEM_HEADER);
+               if (pos->print_names) {
+                       fprintf(pos->fp, "trace:domain = ");
+               }
+               if (opt_trace_domain)
+                       fprintf(pos->fp, "%s", stream_class->trace->domain);
+               if (pos->print_names)
+                       fprintf(pos->fp, ", ");
+               dom_print = 1;
+       }
+       if ((opt_trace_procname) && stream_class->trace->procname[0] != '\0') {
+               set_field_names_print(pos, ITEM_HEADER);
+               if (pos->print_names) {
+                       fprintf(pos->fp, "trace:procname = ");
+               } else if (dom_print) {
+                       fprintf(pos->fp, ":");
+               }
+
+               if (opt_trace_procname)
+                       fprintf(pos->fp, "%s", stream_class->trace->procname);
+               if (pos->print_names)
+                       fprintf(pos->fp, ", ");
+               dom_print = 1;
+       }
+       if ((opt_trace_vpid) && stream_class->trace->vpid[0] != '\0') {
+               set_field_names_print(pos, ITEM_HEADER);
+               if (pos->print_names) {
+                       fprintf(pos->fp, "trace:vpid = ");
+               } else if (dom_print) {
+                       fprintf(pos->fp, ":");
+               }
+
+               if (opt_trace_vpid)
+                       fprintf(pos->fp, "%s", stream_class->trace->vpid);
+               if (pos->print_names)
+                       fprintf(pos->fp, ", ");
+               dom_print = 1;
+       }
+       if (dom_print && !pos->print_names)
+               fprintf(pos->fp, " ");
+       set_field_names_print(pos, ITEM_HEADER);
        if (pos->print_names)
                fprintf(pos->fp, "name = ");
        fprintf(pos->fp, "%s", g_quark_to_string(event_class->name));
@@ -148,10 +259,12 @@ int ctf_text_write_event(struct stream_pos *ppos,
        if (stream->stream_packet_context) {
                if (pos->field_nr++ != 0)
                        fprintf(pos->fp, ",");
+               set_field_names_print(pos, ITEM_SCOPE);
                if (pos->print_names)
                        fprintf(pos->fp, " stream.packet.context =");
                field_nr_saved = pos->field_nr;
                pos->field_nr = 0;
+               set_field_names_print(pos, ITEM_CONTEXT);
                ret = generic_rw(ppos, &stream->stream_packet_context->p);
                if (ret)
                        goto error;
@@ -162,10 +275,12 @@ int ctf_text_write_event(struct stream_pos *ppos,
        if (babeltrace_verbose && stream->stream_event_header) {
                if (pos->field_nr++ != 0)
                        fprintf(pos->fp, ",");
+               set_field_names_print(pos, ITEM_SCOPE);
                if (pos->print_names)
                        fprintf(pos->fp, " stream.event.header =");
                field_nr_saved = pos->field_nr;
                pos->field_nr = 0;
+               set_field_names_print(pos, ITEM_CONTEXT);
                ret = generic_rw(ppos, &stream->stream_event_header->p);
                if (ret)
                        goto error;
@@ -176,10 +291,12 @@ int ctf_text_write_event(struct stream_pos *ppos,
        if (stream->stream_event_context) {
                if (pos->field_nr++ != 0)
                        fprintf(pos->fp, ",");
+               set_field_names_print(pos, ITEM_SCOPE);
                if (pos->print_names)
                        fprintf(pos->fp, " stream.event.context =");
                field_nr_saved = pos->field_nr;
                pos->field_nr = 0;
+               set_field_names_print(pos, ITEM_CONTEXT);
                ret = generic_rw(ppos, &stream->stream_event_context->p);
                if (ret)
                        goto error;
@@ -190,10 +307,12 @@ int ctf_text_write_event(struct stream_pos *ppos,
        if (event->event_context) {
                if (pos->field_nr++ != 0)
                        fprintf(pos->fp, ",");
+               set_field_names_print(pos, ITEM_SCOPE);
                if (pos->print_names)
                        fprintf(pos->fp, " event.context =");
                field_nr_saved = pos->field_nr;
                pos->field_nr = 0;
+               set_field_names_print(pos, ITEM_CONTEXT);
                ret = generic_rw(ppos, &event->event_context->p);
                if (ret)
                        goto error;
@@ -204,10 +323,12 @@ int ctf_text_write_event(struct stream_pos *ppos,
        if (event->event_fields) {
                if (pos->field_nr++ != 0)
                        fprintf(pos->fp, ",");
+               set_field_names_print(pos, ITEM_SCOPE);
                if (pos->print_names)
                        fprintf(pos->fp, " event.fields =");
                field_nr_saved = pos->field_nr;
                pos->field_nr = 0;
+               set_field_names_print(pos, ITEM_PAYLOAD);
                ret = generic_rw(ppos, &event->event_fields->p);
                if (ret)
                        goto error;
@@ -225,7 +346,10 @@ error:
 }
 
 
-struct trace_descriptor *ctf_text_open_trace(const char *path, int flags)
+struct trace_descriptor *ctf_text_open_trace(const char *collection_path,
+               const char *path, int flags,
+               void (*move_pos_slow)(struct ctf_stream_pos *pos, size_t offset,
+                       int whence), FILE *metadata_fp)
 {
        struct ctf_text_stream_pos *pos;
        FILE *fp;
@@ -243,7 +367,7 @@ struct trace_descriptor *ctf_text_open_trace(const char *path, int flags)
                pos->fp = fp;
                pos->parent.rw_table = write_dispatch_table;
                pos->parent.event_cb = ctf_text_write_event;
-               pos->print_names = opt_field_names;
+               pos->print_names = 0;
                break;
        case O_RDONLY:
        default:
This page took 0.043214 seconds and 4 git commands to generate.