Rafaël Carré schrieb:
On Fri, 17 Jul 2009 08:49:14 +0100
Rob Purchase <[email protected]> wrote:

On 17/07/2009 05:55, Thomas Martitz wrote:
storage_sleep, storage_spin, storage_spindown are only defined if #defiend (HAVE_DISK_STORAGE), not for MMC/ATA/SD remove already unneeded nand_disk_is_active, nand_soft_reset
Isn't the point of an API to forget about underlying differences so that a developer doesn't need to care/know about this differences? This commit introduces more (imo ugly) #ifdefs with destroying that point.
I agree, the idea of the storage_* layer was to hide the underlying differences and avoid the need for those #ifdefs.

Since the functions are voided in storage.h , the complexity is hidden
from developers.

I don't know the term, but I figure with voiding you mean making it a simple #define?
The complexity isn't hidden, at least not for plugin developers.
That is different for storage_spin,storage_sleep, and storage_spindown
since they are used in the plugin API.

Some calls to these functions were already undef #ifdef
HAVE_DISK_STORAGE, so I only continued this way.

Probably only because they're not in the plugin API.
In storage.h , storage_soft_reset and storage_disk_is_active were
already voided for some storage types so I thought it would be right to
continue in this direction.


I don't agree with that. I think the opposite way would be proper, to enfore the API.
A better solution might be for these functions to still exist at storage_* level, either by #defining to the relevant driver on single-storage-driver targets, or as an actual function on
multi-driver targets. The storage rework patch (FS#9545) already goes
some way towards this, but it does not yet remove the unncessary
driver-specific functions.  The actual driver-level functions could
be voided, but not storage_*.

storage_* functions could be voided (just like this commit does) in the
appropriate configuration, perhaps I missed something.

The problem with this approach is how to expose those functions to
the plugin API on single-driver, non-ATA targets. A solution for this
might simply be to always use a concrete storage_* function. I can't
really see that being much of an overhead.

They only really need to be exported when HAVE_DISK_STORAGE is defined,
right?

See, here the "complexity is hidden for developers" argument becomes simply wrong. For core code it's hidden, for plugins not. That's even worse than #ifdeffing all the way IMO.
It is true that the overhead is very minimal:

If you look at the build table for this commit, there was a binsize
decrease between 50 and 100 bytes for some targets (onda / SD, ondio /
MMC even if i forgot to remove the actual functions from ata_mmc.c) and
an increase between 38 & 58 bytes for Clip/Fuze/e200v2 (SD).

There is other ways to remove unused code (-ffunction-sections /
-gc-sections, or defining the functions as static inline in
<storage-type>.h but that still leaves quite a lot of disk-specific
functions into all storage drivers (them being implemented at a generic
level or a target-specific level)

That's the downside of a generic API. Is that a problem? Why was it API'fied in the first place? Either we use an API, which may cost a tiny bit binsize due to stubs, or we go for plain disk type specific functions.

What we have now is a mix. An API which pretends to be one, but which isn't one actually. This is just bad, IMO.
In any case, I would rather see this done as part of the existing storage rework patch.

Is that anywhere near ready for commit? It's been quite about it since a long time.

Best regards.

Reply via email to