Retry needs to recreate type def and aliases too
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 26 Jul 2011 00:38:05 +0000 (20:38 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 26 Jul 2011 00:38:05 +0000 (20:38 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
formats/ctf/metadata/ctf-visitor-generate-io-struct.c

index f0e5b4744667d7a1e8a52f638082ba32e4727f9a..ff5ae052abc0aa0f40ea7ade402d9c4dfa05ce81 100644 (file)
@@ -1957,7 +1957,6 @@ int ctf_trace_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace
        int ret = 0;
        struct ctf_node *iter;
 
        int ret = 0;
        struct ctf_node *iter;
 
-restart:
        if (trace->declaration_scope)
                return -EEXIST;
        trace->declaration_scope = new_declaration_scope(trace->root_declaration_scope);
        if (trace->declaration_scope)
                return -EEXIST;
        trace->declaration_scope = new_declaration_scope(trace->root_declaration_scope);
@@ -2007,10 +2006,6 @@ error:
        g_ptr_array_free(trace->streams, TRUE);
        free_declaration_scope(trace->declaration_scope);
        trace->declaration_scope = 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;
 }
 
        return ret;
 }
 
@@ -2066,9 +2061,11 @@ int ctf_visitor_construct_metadata(FILE *fd, int depth, struct ctf_node *node,
        struct ctf_node *iter;
 
        printf_verbose("CTF visitor: metadata construction... ");
        struct ctf_node *iter;
 
        printf_verbose("CTF visitor: metadata construction... ");
-       trace->root_declaration_scope = new_declaration_scope(NULL);
        trace->byte_order = byte_order;
 
        trace->byte_order = byte_order;
 
+retry:
+       trace->root_declaration_scope = new_declaration_scope(NULL);
+
        switch (node->type) {
        case NODE_ROOT:
                cds_list_for_each_entry(iter, &node->u.root.declaration_list,
        switch (node->type) {
        case NODE_ROOT:
                cds_list_for_each_entry(iter, &node->u.root.declaration_list,
@@ -2081,6 +2078,15 @@ int ctf_visitor_construct_metadata(FILE *fd, int depth, struct ctf_node *node,
                }
                cds_list_for_each_entry(iter, &node->u.root.trace, siblings) {
                        ret = ctf_trace_visit(fd, depth + 1, iter, trace);
                }
                cds_list_for_each_entry(iter, &node->u.root.trace, siblings) {
                        ret = ctf_trace_visit(fd, depth + 1, iter, trace);
+                       if (ret == -EINTR) {
+                               free_declaration_scope(trace->root_declaration_scope);
+                               /*
+                                * Need to restart creation of type
+                                * definitions, aliases and
+                                * trace header declarations.
+                                */
+                               goto retry;
+                       }
                        if (ret) {
                                fprintf(fd, "[error] %s: trace declaration error\n", __func__);
                                goto error;
                        if (ret) {
                                fprintf(fd, "[error] %s: trace declaration error\n", __func__);
                                goto error;
This page took 0.034744 seconds and 4 git commands to generate.