]> git.infradead.org Git - users/dhowells/kafs-utils.git/commitdiff
rxgen: Save trailing comments on error codes in .xg files for exception message
authorDavid Howells <dhowells@redhat.com>
Fri, 11 Apr 2014 12:21:28 +0000 (13:21 +0100)
committerDavid Howells <dhowells@redhat.com>
Fri, 11 Apr 2014 12:21:28 +0000 (13:21 +0100)
Save the trailing comment on an error code definition in a .xg file and attach
it to the python exception raised if a matching abort is received.

Signed-off-by: David Howells <dhowells@redhat.com>
py_rxgen.c
py_rxgen.h
rxgen/emit_py_module.pm
rxgen/rxgen.pl

index db8713aca2a5c855e5a8bbc5e54c743747fdbe5d..acdfa9b7a024d3c753186c8e4b41b076049f2bd1 100644 (file)
@@ -1046,6 +1046,7 @@ static int py_rxgen_received_abort_cmp(const void *key, const void *_entry)
 PyObject *py_rxgen_received_abort(struct rx_call *call)
 {
        const struct kafs_abort_list *entry;
+       const char *msg;
        PyObject *ex;
 
        entry = bsearch((void *)(unsigned long)call->abort_code,
@@ -1054,10 +1055,16 @@ PyObject *py_rxgen_received_abort(struct rx_call *call)
                        sizeof(kafs_abort_map[0]),
                        py_rxgen_received_abort_cmp);
 
-       if (entry)
+       if (entry) {
                ex = entry->obj;
-       else
+               msg = entry->msg;
+       } else {
                ex = kafs_remote_abort;
+               msg = NULL;
+       }
 
-       return PyErr_Format(ex, "Aborted %u", call->abort_code);
+       if (msg)
+               return PyErr_Format(ex, "Aborted %u: %s", call->abort_code, msg);
+       else
+               return PyErr_Format(ex, "Aborted %u", call->abort_code);
 }
index 8fd2d164d809585f506df09144c1a0ecc2558488..3ffce61191d69a2eee72924c5907c08f66dc8da2 100644 (file)
@@ -94,6 +94,7 @@ extern int py_rxgen_premarshal_structs(void *array, size_t n, size_t size, size_
  */
 struct kafs_abort_list {
        uint32_t        id;
+       const char      *msg;
        PyObject        *obj;
 };
 
index ceca7ed6f342b788b9e4971e77cad4697472ddee..38b31b25a5450ebe9c806b0faffeb1cff8b93105 100644 (file)
@@ -33,13 +33,14 @@ sub emit_py_module() {
     print PYOUT "\n";
     print PYHDR "extern struct kafs_abort_list kafs_abort_map[", $abort_count, "];\n";
 
-    my %abort_table_map = ();
     my $index = 0;
     print PYOUT "struct kafs_abort_list kafs_abort_map[", $abort_count, "] = {\n";
     foreach my $id (sort {$a <=> $b} keys(%abort_ids)) {
-       my $name = $abort_ids{$id};
-       print PYOUT "\t{ .id = ", $name, " }, /* ", $id, " */\n";
-       $abort_table_map{$name} = $index++;
+       my $abort = $abort_ids{$id};
+       print PYOUT "\t{ .id = ", $abort->{sym};
+       print PYOUT ", .msg = \"", $abort->{msg}, "\"" if ($abort->{msg});
+       print PYOUT " }, /* ", $abort->{id}, " */\n";
+       $abort->{index} = $index++;
     }
     print PYOUT "};\n\n";
 
@@ -123,8 +124,8 @@ sub emit_py_module() {
 
     foreach $_ (sort(keys(%packages))) {
        my $pkg = $packages{$_};
-       my $codes = $pkg->{abort_codes};
-       next unless (@{$codes});
+       my $abort_codes = $pkg->{abort_codes};
+       next unless (@{$abort_codes});
 
        my $pkg_abort = $pkg->{name} . "Abort";
        my $pkg_sym = "kafs_" . $pkg->{name} . "_abort";
@@ -136,16 +137,16 @@ sub emit_py_module() {
        print PYOUT "\tPy_INCREF(", $pkg_sym, ");\n";
        print PYOUT "\tPyModule_AddObject(m, \"", $pkg_abort, "\", ", $pkg_sym, ");\n";
 
-       foreach my $code (sort(@{$codes})) {
-           my $code_abort = "Abort" . $code;
-           my $code_sym = "kafs_abort_map[" . $abort_table_map{$code} . "].obj";
+       foreach my $abort (sort { $a->{id} <=> $b->{id}; } @{$abort_codes}) {
+           my $abort_name = "Abort" . $abort->{sym};
+           my $abort_var = "kafs_abort_map[" . $abort->{index} . "].obj";
 
            print PYOUT "\n";
-           print PYOUT "\t", $code_sym, " = PyErr_NewException(\"kafs.", $code_abort, "\", ", $pkg_sym, ", NULL);\n";
-           print PYOUT "\tif (!", $code_sym, ")\n";
+           print PYOUT "\t", $abort_var, " = PyErr_NewException(\"kafs.", $abort_name, "\", ", $pkg_sym, ", NULL);\n";
+           print PYOUT "\tif (!", $abort_var, ")\n";
            print PYOUT "\t\treturn NULL;\n";
-           print PYOUT "\tPy_INCREF(", $code_sym, ");\n";
-           print PYOUT "\tPyModule_AddObject(m, \"", $code_abort, "\", ", $code_sym, ");\n";
+           print PYOUT "\tPy_INCREF(", $abort_var, ");\n";
+           print PYOUT "\tPyModule_AddObject(m, \"", $abort_name, "\", ", $abort_var, ");\n";
        }
     }
 
index 5c5a7501b614d0a31a2ec25b67568e506218678e..9a2e18aeaca2abd3e1a7fb1bf9ed6ad0f7c2b046 100755 (executable)
@@ -175,11 +175,13 @@ sub parse_xg($) {
        $error_codes = 0 if ($line eq "");
 
        # Discard comments
+       my $line_comment = "";
 find_comment_terminator:
        if ($comment_discard) {
            # Find the terminator for a comment we're discarding
-           if ($line =~ m@.*[*]/(.*)@) {
-               $line = $pre_comment . $1;
+           if ($line =~ m@(.*)[*]/(.*)@) {
+               $line_comment = $1;
+               $line = $pre_comment . $2;
                $comment_discard = 0;
            } else {
                $line = $pre_comment;
@@ -208,6 +210,10 @@ discarded_comments:
        $line =~ s!\t!!g;
        next if (!$line);
 
+       $line_comment =~ s/^\s+//;
+       $line_comment =~ s/\s+$//;
+       $line_comment =~ s/\s+/ /g;
+
        #print "'$line'\n";
 
        # Complain about #defines
@@ -249,9 +255,16 @@ discarded_comments:
 
                die $where, ": Duplicate abort ID"
                    if (exists $abort_ids{$v});
-               push @{$abort_codes}, $c;
-               $abort_syms{$c} = $v;
-               $abort_ids{$v} = $c;
+
+               my %abort = (
+                   sym => $c,
+                   id => $v,
+                   msg => $line_comment,
+               );
+
+               push @{$abort_codes}, \%abort;
+               $abort_syms{$c} = \%abort;
+               $abort_ids{$v} = \%abort;
                $abort_count++;
            }
            next;