X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=f0e5b4744667d7a1e8a52f638082ba32e4727f9a;hb=0d72513f59db3db1306602a34c15c0afda5526eb;hp=fcb73838ddc4abebe740284a4f80a5eb5593cc71;hpb=5c551b40d8697add8fde696de8bce7c2d43993ea;p=babeltrace.git diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index fcb73838..f0e5b474 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -1898,7 +1898,18 @@ int ctf_trace_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru ret = -EPERM; goto error; } else { - trace->byte_order = byte_order; + if (byte_order != trace->byte_order) { + trace->byte_order = byte_order; + /* + * We need to restart + * construction of the + * intermediate representation. + */ + trace->field_mask = 0; + CTF_TRACE_SET_FIELD(trace, byte_order); + ret = -EINTR; + goto error; + } } CTF_TRACE_SET_FIELD(trace, byte_order); } else if (!strcmp(left, "packet.header")) { @@ -1946,6 +1957,7 @@ int ctf_trace_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace int ret = 0; struct ctf_node *iter; +restart: if (trace->declaration_scope) return -EEXIST; trace->declaration_scope = new_declaration_scope(trace->root_declaration_scope); @@ -1988,10 +2000,17 @@ int ctf_trace_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace return 0; error: - if (trace->packet_header_decl) + if (trace->packet_header_decl) { declaration_unref(&trace->packet_header_decl->p); + trace->packet_header_decl = NULL; + } g_ptr_array_free(trace->streams, TRUE); free_declaration_scope(trace->declaration_scope); + trace->declaration_scope = NULL; + /* byte order changed while creating types, retry. */ + if (ret == -EINTR) { + goto restart; + } return ret; }