Javier Martín wrote: > But you negate any performance gain when you _do_ traverse the list to > add an entry to it instead of just make it the new head as I do. > Besides, even for that, double indirection should be avoided in the > structure previous pointer because it makes things oh-so-incredibly > confusing. I was thinking about code size then about performance or easy of understanding. On my system this code results in 91 addition bytes in core image (63 if I remove grub_error). Do you have any idea how it would be possible to do an error message without description or put some generic description? > > Besides, I think the "user" (i.e. module) visible type returned by _add > and taken by _remove should be a "blank hidden type", i.e. you don't > need to declare "struct grub_preboot_t" in loader.h because the public > interface only uses _pointers_ to it, whose size is known. This is all > the C compiler requires and you avoid polluting the namespace with > internal implementation details. I recommend the following typedefs: > > typedef struct grub_preboot_t* grub_preboot_hnd; > typedef grub_err_t *(grub_preboot_func)(int noreturn); > > So that the prototypes would look > > grub_preboot_hnd add(grub_preboot_func f); > void remove(grub_preboot_hnd handle); I noticed that actually no code needs the size of grub_preoot_hnd. So I changed it to void * Vladimir Serbinenko