On Tue, Jul 21, 2015 at 05:45:43PM +0100, Frediano Ziglio wrote: > Use an array to declare tree items instead of allocating it statically. > This save a bit of memory and it also generate smaller code to read. 'generates' > A tree in wireshark represent an item which could be expanded. 'represents' > Possibly wireshark is using these registrations to save expansion > state in the user interface. (I can adjust the logs before pushing actually if that's more convenient for you). Christophe > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > codegen/dissector_test.c | 13 +++++++++++++ > python_modules/dissector.py | 28 ++++++++++++++++++++++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/codegen/dissector_test.c b/codegen/dissector_test.c > index 6189da0..3212655 100644 > --- a/codegen/dissector_test.c > +++ b/codegen/dissector_test.c > @@ -13,9 +13,11 @@ > enum { > first_hf_registered = 0x10000, > first_ei_registered = 0x20000, > + first_tree_registered = 0x30000, > }; > static int last_hf_registered = first_hf_registered - 1; > static int last_ei_registered = first_ei_registered - 1; > +static int last_tree_registered = first_tree_registered - 1; > > WS_DLL_PUBLIC void > proto_register_field_array(const int parent, hf_register_info *hf, const int num_records) > @@ -31,6 +33,17 @@ proto_register_field_array(const int parent, hf_register_info *hf, const int num > } > > WS_DLL_PUBLIC void > +proto_register_subtree_array(gint *const *indices, const int num_indices) > +{ > + int i; > + assert(num_indices >= 0); > + for (i = 0; i < num_indices; ++i) { > + assert(indices && *indices[i] == -1); > + *indices[i] = ++last_tree_registered; > + } > +} > + > +WS_DLL_PUBLIC void > expert_register_field_array(expert_module_t* module, ei_register_info *ei, const int num_records) > { > int i; > diff --git a/python_modules/dissector.py b/python_modules/dissector.py > index 45f8737..52234fc 100644 > --- a/python_modules/dissector.py > +++ b/python_modules/dissector.py > @@ -2,6 +2,22 @@ > from . import codegen > import re > > + > +# generate a new tree identifier > +ett_writer = None > +ett_num = 0 > +def new_ett(writer): > + global ett_writer > + global ett_num > + > + if ett_num and ett_num % 16 == 0: > + ett_writer.newline() > + name = 'etts[%u]' % ett_num > + ett_num = ett_num + 1 > + ett_writer.write('-1, ') > + return name > + > + > hf_writer = None > hf_defs = None > > @@ -54,6 +70,10 @@ def write_protocol_definitions(writer): > writer.newline() > writer.function('spice_register_fields', 'void', 'int proto, expert_module_t* expert_proto') > > + writer.variable_def('guint', 'n'); > + writer.variable_def('gint *', 'ett[array_length(etts)]') > + writer.newline() > + > writer.write("static hf_register_info hf[] = ") > writer.begin_block() > hf_defs = writer.get_subwriter() > @@ -66,17 +86,25 @@ def write_protocol_definitions(writer): > writer.end_block(semicolon = True) > writer.newline() > > + with writer.for_loop('n', 'array_length(etts)'): > + writer.assign('ett[n]', '&etts[n]') > + > writer.statement('proto_register_field_array(proto, hf, array_length(hf))') > + writer.statement('proto_register_subtree_array(ett, array_length(etts))') > writer.statement('expert_register_field_array(expert_proto, ei, array_length(ei))') > writer.end_block() > > > def write_protocol_parser(writer, proto): > global hf_writer > + global ett_writer > > write_parser_helpers(writer) > > # put fields declaration first > + with writer.block('static gint etts[] =', semicolon=True) as scope: > + ett_writer = scope > + writer.newline() > hf_writer = writer.get_subwriter() > > # put fields definition at last > -- > 2.1.0 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
pgpGDZfGAnXLI.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel