You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2014/05/16 21:04:15 UTC

svn commit: r1595306 - in /qpid/proton/trunk/proton-c/src: codec/codec.c protocol.h.py

Author: astitcher
Date: Fri May 16 19:04:14 2014
New Revision: 1595306

URL: http://svn.apache.org/r1595306
Log:
PROTON-558: Rearrange FIELD table to save space:
- Splitting the table into 2 string tables
  and just put table offsets in the actual FIELD table.
- Make tables constant to give them a chance to get into
  the program text
- Add error checking to make sure we don't access the wrong
  field name or a null.

Modified:
    qpid/proton/trunk/proton-c/src/codec/codec.c
    qpid/proton/trunk/proton-c/src/protocol.h.py

Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1595306&r1=1595305&r2=1595306&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Fri May 16 19:04:14 2014
@@ -92,7 +92,7 @@ static void pn_data_finalize(void *objec
   pn_free(data->encoder);
 }
 
-static pn_fields_t *pni_node_fields(pn_data_t *data, pni_node_t *node)
+static const pn_fields_t *pni_node_fields(pn_data_t *data, pni_node_t *node)
 {
   if (!node) return NULL;
   if (node->atom.type != PN_DESCRIBED) return NULL;
@@ -104,7 +104,8 @@ static pn_fields_t *pni_node_fields(pn_d
   }
 
   if (descriptor->atom.u.as_ulong < 256) {
-    return &FIELDS[descriptor->atom.u.as_ulong];
+    const pn_fields_t *f = &FIELDS[descriptor->atom.u.as_ulong];
+    return (f->name_index!=0) ? f : NULL;
   } else {
     return NULL;
   }
@@ -245,9 +246,9 @@ int pni_inspect_enter(void *ctx, pn_data
   pn_atom_t *atom = (pn_atom_t *) &node->atom;
 
   pni_node_t *parent = pn_data_node(data, node->parent);
-  pn_fields_t *fields = pni_node_fields(data, parent);
+  const pn_fields_t *fields = pni_node_fields(data, parent);
   pni_node_t *grandparent = parent ? pn_data_node(data, parent->parent) : NULL;
-  pn_fields_t *grandfields = pni_node_fields(data, grandparent);
+  const pn_fields_t *grandfields = pni_node_fields(data, grandparent);
   int index = pni_node_index(data, node);
 
   int err;
@@ -256,7 +257,9 @@ int pni_inspect_enter(void *ctx, pn_data
     if (atom->type == PN_NULL) {
       return 0;
     }
-    const char *name = grandfields->fields[index];
+    const char *name = (index < grandfields->field_count)
+        ? FIELD_FIELDS[grandfields->first_field_index+index]
+        : NULL;
     if (name) {
       err = pn_string_addf(str, "%s=", name);
       if (err) return err;
@@ -275,7 +278,7 @@ int pni_inspect_enter(void *ctx, pn_data
     return pn_string_addf(str, "{");
   default:
     if (fields && index == 0) {
-      err = pn_string_addf(str, "%s", fields->name);
+      err = pn_string_addf(str, "%s", FIELD_NAME[fields->name_index]);
       if (err) return err;
       err = pn_string_addf(str, "(");
       if (err) return err;
@@ -305,7 +308,7 @@ int pni_inspect_exit(void *ctx, pn_data_
   pn_string_t *str = (pn_string_t *) ctx;
   pni_node_t *parent = pn_data_node(data, node->parent);
   pni_node_t *grandparent = parent ? pn_data_node(data, parent->parent) : NULL;
-  pn_fields_t *grandfields = pni_node_fields(data, grandparent);
+  const pn_fields_t *grandfields = pni_node_fields(data, grandparent);
   pni_node_t *next = pn_data_node(data, node->next);
   int err;
 

Modified: qpid/proton/trunk/proton-c/src/protocol.h.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/protocol.h.py?rev=1595306&r1=1595305&r2=1595306&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/protocol.h.py (original)
+++ qpid/proton/trunk/proton-c/src/protocol.h.py Fri May 16 19:04:14 2014
@@ -48,33 +48,58 @@ for type in TYPES:
 print
 
 print """typedef struct {
-  const char *name;
-  const char *fields[32];
-} pn_fields_t;"""
+  const unsigned char name_index;
+  const unsigned char first_field_index;
+  const unsigned char field_count;
+} pn_fields_t;
+
+extern const pn_fields_t FIELDS[256];
+extern const char * const FIELD_NAME[];
+extern const char * const FIELD_FIELDS[];
+"""
 
-print
+print "#ifdef DEFINE_FIELDS"
 
-print "#ifndef DEFINE_FIELDS"
-print "extern"
-print "#endif"
+print "const char * const FIELD_NAME[] = {"
+print "  NULL,"
+index = 1
+for i in range(256):
+  if i in fields:
+    name, fnames = fields[i]
+    print '  "%s", /* %d */' % (name, index)
+    index += 1
+print "};"
+
+print "const char * const FIELD_FIELDS[] = {"
+print "  NULL,"
+index = 1
+for i in range(256):
+  if i in fields:
+    name, fnames = fields[i]
+    if fnames:
+      for f in fnames:
+        print '  "%s", /* %d (%s) */' % (f, index, name)
+        index += 1
+print "};"
 
-print "pn_fields_t FIELDS[256]"
-print "#ifdef DEFINE_FIELDS"
-print " = {"
+print "const pn_fields_t FIELDS[256] = {"
 
+name_count = 1
+field_count = 1
 for i in range(256):
   if i in fields:
     name, fnames = fields[i]
     if fnames:
-      print '  {"%s", {%s}},' % (name, ", ".join(['"%s"' % f for f in fnames]))
+      print '  {%d, %d, %d}, /* %d (%s) */' % (name_count, field_count, len(fnames), i, name)
+      field_count += len(fnames)
     else:
-      print '  {"%s", {NULL}},' % name
+      print '  {%d, 0, 0}, /* %d (%s) */' % (name_count, i, name)
+    name_count += 1
   else:
-    print '  {NULL, {NULL}},'
+    print '  {0, 0, 0}, /* %d */' % i
 
-print "}"
+print "};"
 print "#endif"
-print ";"
 
 print
 print "#endif /* protocol.h */"



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org