Struct Inheritance in drivers/ata/
Peter Hamilton
peterghamilton at gmail.com
Thu May 26 22:20:30 EDT 2011
I see that it works, but I'm not exactly following how. Maybe I just don't
have enough C experience. But I can't seem to duplicate that functionality.
I understand the way I've normally seen inheritance, where:
struct Child {
struct Parent p;
int somethingOnlyForChildren;
}
Or something similar. Then the Child struct can be casted as a Parent, and
since there is no padding before the first piece of data in a struct, every
parent attribute is accessed as though the struct were a Parent.
I see how it all lines up in memory, but in the case of the kernel code I
can't quite follow it. Wouldn't everything assigned to 'inherits' be so
much farther down in memory? I feel like I'm missing something. Is there a
special way they all need to be accessed?
- Peter
On Thu, May 26, 2011 at 7:23 PM, Greg KH <greg at kroah.com> wrote:
> On Thu, May 26, 2011 at 02:46:08PM -0600, Peter Hamilton wrote:
> > The code in drivers/ata/ uses an implementation of inheritance that I
> have not
> > seen before. It's only briefly explained in the header file (
> include/linux/
> > libata.h:885):
> >
> > /*
> > * ->inherits must be the last field and all the preceding
> > * fields must be pointers.
> > */
> >
> > The structs are then initialized with .inherits assigned first:
> >
> > drivers/ata/sata_nv.c:475
> >
> > static struct ata_port_operations nv_nf2_ops = {
>
> > .inherits = &nv_generic_ops,
> > .freeze = nv_nf2_freeze,
>
> > .thaw = nv_nf2_thaw,
>
> > };
> >
> >
> > Is this actually implementing inheritance? Why do all preceding fields
> need to
> > be pointers?
> >
> > As far as I can tell, this style is only found in the ata drivers.
>
> I think you are right, but more subsystems need to emulate it, it is
> very powerful and works very well. I have been wanting to convert the
> usb-serial layer to use the same thing one of these days.
>
> > Could anyone explain how this works?
>
> The code is all there that shows it, but basically the driver is telling
> the core to "use this type of functions, but if I set any others, use
> them instead." It's a nicer way of doing inheritance in C than we do in
> other places in the kernel where we are a bit more "verbose" in making
> it happen.
>
> hope this helps,
>
> greg k-h
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110526/a66e84ee/attachment-0001.html
More information about the Kernelnewbies
mailing list