On Sun, Dec 13, 2009 at 09:59:57PM +0100, Stefan Weil wrote:
> Michael S. Tsirkin schrieb:
> > On Sat, Dec 12, 2009 at 08:45:06PM +0100, Stefan Weil wrote:
> >> Michael S. Tsirkin schrieb:
> >>> On Mon, Nov 30, 2009 at 06:05:31PM +0100, Stefan Weil wrote:
> >>>> Michael S. Tsirkin schrieb:
> >>>>> On Thu, Nov 19, 2009 at 09:54:46PM +0100, Stefan Weil wrote:
> >>>>>> Handling of transmit commands is rather complex,
> >>>>>> so about 80 lines of code were moved from function
> >>>>>> action_command to the new function tx_command.
> >>>>>>
> >>>>>> The two new values "tx" and "cb_address" in the
> >>>>>> eepro100 status structure made this possible without
> >>>>>> passing too many parameters.
> >>>>>>
> >>>>>> In addition, the moved code was cleaned a little bit:
> >>>>>> old comments marked with //~ were removed, C++ style
> >>>>>> comments were replaced by C style comments, C++ like
> >>>>>> variable declarations after code were reordered.
> >>>>>>
> >>>>>> Simplified mode is still broken. Nor did I fix
> >>>>>> endianess issues. Both problems will be fixed in
> >>>>>> additional patches (which need this one).
> >>>>>>
> >>>>>> Signed-off-by: Stefan Weil <w...@mail.berlios.de>
> >>>>>> ---
> >>>>>> hw/eepro100.c | 192
> >>>>>> +++++++++++++++++++++++++++++----------------------------
> >>>>>> 1 files changed, 98 insertions(+), 94 deletions(-)
> >>>>>>
> >>>>>> diff --git a/hw/eepro100.c b/hw/eepro100.c
> >>>>>> index 4210d8a..7093af8 100644
> >>>>>> --- a/hw/eepro100.c
> >>>>>> +++ b/hw/eepro100.c
> >>>>>> @@ -213,6 +213,10 @@ typedef struct {
> >>>>>> uint32_t ru_offset; /* RU address offset */
> >>>>>> uint32_t statsaddr; /* pointer to eepro100_stats_t */
> >>>>>>
> >>>>>> + /* Temporary data. */
> >>>>>> + eepro100_tx_t tx;
> >>>>>> + uint32_t cb_address;
> >>>>>> +
> >>>>> That's pretty evil, as it makes routines non-reentrant.
> >>>>> How bad is it to pass 2 additional arguments around?
> >>>>> If not, maybe define struct tx_command and put necessary stuff there,
> >>>>> then pass pointer to that?
> >>>> Yes, I know that it makes routines non-reentrant, or
> >>>> to be more exact: it makes routines non-reentrant
> >>>> for the same device instance. Different device instances
> >>>> are reentrant because each instance maintains its
> >>>> own status.
> >>>>
> >>>> No, it's not evil.
> >>> "Temporary data" comment is very evil.
> >>> We not only don't want to document code,
> >>> we document this fact.
> >>>
> >>>> The state machine of the real hardware
> >>>> is not expected to be used in a reentrant way. The same
> >>>> applies to the emulated hardware.
> >>> That code does not appear currently structured as a state machine.
> >>>
> >>>> Do you expect reentrant calls of transmit or receive
> >>>> functions for one device instance?
> >>>>
> >>>> Regards,
> >>>> Stefan
> >>> Datastructures should make sense. This one does not seem to make sense.
> >>> What's the benefit here? Why is it good to pass less
> >>> parameters to functions?
> >> Hello Michael,
> >>
> >> I don't think that "very evil" is a good way to describe code someone
> >> has written.
> >> But maybe there is a misunderstanding caused because you and I are not
> >> native
> >> english speakers.
> >>
> >> Antony, perhaps a better comment for the two temporary values would be
> >> "Temporary data used to pass status information between functions, don't
> >> save it."
> >
> > This does not address the basic problems that 1. just figuring out
> > what data should a field contain requires reading code that
> > initializes it 2. the code becomes non-reentrant and more fragile.
> 
> 1. Yes, of course you have to read code to understand it.
>    I don't see  your point here - maybe a problem of the language.
> 2. Reentrancy is not a problem here (I explained that already).
>    "More fragile" is a subjective feedback, my feeling is different.
> 
> >
> >> Feel free to change this comment. Michael, maybe you have a better
> >> suggestion?
> >
> > Yes. Add a couple of extra parameters to the functions that
> > you call, with names specifying what do the values contain.
> 
> There are many ways to do things in programming.
> I decided to do it the way it is, and you prefer a different way.
> That's ok, but as long as there are no better arguments,
> let me do it my way (up to now, eepro100.c was written
> and maintained by me).
> 
> >> Both values will be used in more functions with patches to come,
> >> sometimes also as output parameter. So adding a new status structure for
> >> temporary status values or even passing simple data types
> >> would make the code less comprehensible.
> >>
> >> Kind regards,
> >> Stefan
> >
> > I haven't seen that code so I can not judge.
> 
> Here is the URL:
> http://repo.or.cz/w/qemu/ar7.git/blob/HEAD:/hw/eepro100.c
> >
> > On the surface, it sounds like using parameters will be better.
> > It is a *good idea* to pass input parameters as int X and
> > output parameters as int *X, rather than sticking them in some random
> > structure just because same function happens to already get a pointer
> > to it.
> 
> If it were some random structure, you would be right.
> I repeat myself: it is not some random structure but the
> device status. Both values are device status values.

Well, can you please try to document them harder than "Temporary
values"? E.g. write what they represent and when are they valid.

-- 
MST


Reply via email to