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