[flashrom] [Patch] + RFC: Use shutdown callback mechanism to shutdown programmers

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Wed May 4 01:07:51 CEST 2011


Am 03.05.2011 02:08 schrieb David Hendricks:
> Thanks for the comments! I tend to agree with them all. FWIW, we've been
> testing the basic ideas here in the Chromium OS version and it seems to work
> pretty well. So at least I think we're on the right path.
>    

Agreed.


> On Wed, Apr 27, 2011 at 7:56 AM, Carl-Daniel Hailfinger wrote:
>    
>> should get_io_perms automatically register
>> release_io_perms? This would kill a few useless shutdown functions.
>>      
> I agree that get_io_perms should register
> release_io_perms.
>    

The more I think about it, the more I wonder if we really should do 
that. If we decide to do it, a failed programmer_init() must be followed 
by a programmer_shutdown() call because there is no way to unregister a 
function (e.g. release_io_perms).
Can you leave out the release_io_perms automatic registration for now 
until we have discussed this and found a model which makes everyone happy?


> On Wed, Apr 27, 2011 at 7:56 AM, Carl-Daniel Hailfinger wrote:
>> Index: flashrom.c
>>      
>>> ===================================================================
>>> --- flashrom.c  (revision 1288)
>>> +++ flashrom.c  (working copy)
>>> @@ -126,7 +126,8 @@
>>>         {
>>>                 .name                   = "internal",
>>>                 .init                   = internal_init,
>>> -               .shutdown               = internal_shutdown,
>>> +               /* called implicitly using shutdown callback */
>>> +//             .shutdown               = internal_shutdown,
>>>                 .map_flash_region       = physmap,
>>>                 .unmap_flash_region     = physunmap,
>>>                 .chip_readb             = internal_chip_readb,
>>>
>>>
>>>        
>> The same for all other programmers, please.
>> And kill the .shutdown struct member everywhere (even in the header file)
>> while you're at it.
>>
>>      
> After giving this some thought, I think getting rid of .shutdown struct
> members might be premature. Perhaps they can be useful for something like
> register_shutdown(programmer.shutdown, data).

AFAICS that would lead to ordering problems for shutdown.


> Also, the structure looks a
> bit awkward without a shutdown member, even if it is superfluous.
>    

Right, that part is a bit awkward. That said, if we register the 
shutdown functions properly, .shutdown should never need to be defined.


> If you still feel we should get rid of the .shutdown member, that's fine
> too. Otherwise we can just change the structure member so that it matches
> the function signature that register_shutdown() expects.
>    

Can you think of a technical reason where 
register_shutdown(somefunction) would not be sufficient? If not, I'd say 
we kill that structure member and reintroduce it only if we stumble over 
some case where it is needed.


> On Wed, Apr 27, 2011 at 7:56 AM, Carl-Daniel Hailfinger wrote:
>    
>> @@ -543,7 +544,7 @@
>>      
>>>         return ret;
>>>   }
>>>
>>> -int programmer_shutdown(void)
>>> +int flashrom_shutdown(void)
>>>   {
>>>         /* Registering shutdown functions is no longer allowed. */
>>>         may_register_shutdown = 0;
>>> @@ -551,7 +552,7 @@
>>>                 int i = --shutdown_fn_count;
>>>                 shutdown_fn[i].func(shutdown_fn[i].data);
>>>        
>> We should care about the result of the shutdown function, even if it is
>> only for printing diagnostic messages.
>>      
> In that case, the shutdown callbacks should return an int. Right now they
> return void. Should we go ahead and update the return type for shutdown
> functions?
>    


Please do.

This is especially useful for libflashrom. My plan is to allow multiple 
sequences of
programmer_init(); do_stuff(); programmer_shutdown();
for different (or identical) programmers without quitting flashrom in 
between.
Assuming that init functions clean up after themselves, the only reason 
to refuse another init is a failed shutdown in the previous cycle.
(Side note: Programmer parameter parsing will need minor changes to work 
as intended once we support such a style of operation.)


> On Wed, Apr 27, 2011 at 7:56 AM, Carl-Daniel Hailfinger wrote
>>> -       return programmer_table[programmer].shutdown();
>>> +       return 0;
>>>        
>> And return the error code of the failing shutdown function (if one failed),
>> zero (if none failed) or some arbitrary value if more than one shutdown
>> function failed.
>>      
> That would be much more useful, but requires the above change.
>    

Go ahead.

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/





More information about the flashrom mailing list