2012/3/20 Lluís Vilanova <vilan...@ac.upc.edu>:
> Stefan Hajnoczi writes:
>
>> 2012/3/13 Lluís Vilanova <vilan...@ac.upc.edu>:
>>> Adds decorators to establish which backend and/or format each routine is 
>>> meant
>>> to process.
>>>
>>> With this, tables enumerating format and backend routines can be eliminated 
>>> and
>>> part of the usage message can be computed in a more generic way.
>>>
>>> Signed-off-by: Lluís Vilanova <vilan...@ac.upc.edu>
>>> Signed-off-by: Harsh Prateek Bora <ha...@linux.vnet.ibm.com>
>>> ---
>>>  Makefile.objs        |    6 -
>>>  Makefile.target      |    3
>>>  scripts/tracetool.py |  320 
>>> ++++++++++++++++++++++++++++++++------------------
>>>  3 files changed, 211 insertions(+), 118 deletions(-)
>
>> I find the decorators are overkill and we miss the chance to use more
>> straightforward approaches that Python supports.  The decorators build
>> structures behind the scenes instead of using classes in an open coded
>> way.  I think this makes it more difficult for people to modify the
>> code - they will need to dig in to what exactly the decorators do -
>> what they do is pretty similar to what you get from a class.
>
>> I've tried out an alternative approach which works very nicely for
>> formats.  For backends it's not a perfect fit because it creates
>> instances when we don't really need them, but I think it's still an
>> overall cleaner approach:
>
>> https://github.com/stefanha/qemu/commit/3500eb43f80f3c9200107aa0ca19a1b57300ef8a
>
>> What do you think?
>
> I don't like it:
>
> 1) Format and backend tables must be manually filled.
>
> 2) The base Backend class has empty methods for each possible format.
>
> 3) There is no control on format/backend compatibility.
>
> But I do like the idea of having a single per-backend class having methods for
> each possible format.
>
> The main reason for automatically establishing formats, backends and their
> compatibility is that the instrumentation patches add some extra formats and
> backends, which makes the process much more tedious if it's not automated.
>
> Whether you use decorators or classes is not that important.
>
> Auto-registration can be accomplished using metaclasses and special
> per-format/backend "special" attributes the metaclasses will look for (e.g. 
> NAME
> to set the commandline-visible name of a format/backend.).
>
> Format/backend compatibility can be established by introspecting into the
> methods on each backend child class, matched against the NAMEs of the 
> registered
> formats.
>
> But going this way does not sound to me like it will be much clearer than
> decorators.
>
> Do you agree? (I'll wait on solving this before fixing the rest of your 
> concerns
> in this series). Do you still prefer classes over decorators?

For formats the Format class plus a dict approach is much nicer than
decorators.  The code is short and easy to understand.

For backends it becomes a little tougher and I was wondering whether
splitting the code into modules would buy us something.  The fact that
you've added '####...' section delimeters shows that tracetool.py is
growing to long and we're putting too many concepts into one file.  If
each backend is a module then we have a natural way of containing
backend-specific code.  Perhaps the module can register itself when
tracetool.py wildcard imports them all.  I think this will approach
the level of magic that decorators involve but with the bonus that we
begin to split the code instead of growing a blob.  What do you think
of putting each backend in its own module?

Do you have a link to your latest code that adds formats/backends?
I'd like to take a quick look to make sure I understand where you're
going with this - I've only been thinking of the current set of
formats/backends.

As the next step with this patch series we could drop this patch.  It
doesn't make an external difference.  Then we can continue to discuss
how to best handle backends as a separate patch.

Stefan

Reply via email to