On 12/13/2011 05:35 AM, Stefan Hajnoczi wrote:
On Mon, Dec 12, 2011 at 7:36 PM, Anthony Liguori<anth...@codemonkey.ws> wrote:
I choose the serial device to showcase what we'll eventually be able to do.
The three relevant files are:
https://github.com/aliguori/qemu/blob/qom-next/hw/isa-serial.c
https://github.com/aliguori/qemu/blob/qom-next/hw/mm-serial.c
https://github.com/aliguori/qemu/blob/qom-next/hw/serial.c
I'm not sure I understand how init functions are called for derived
classes.
There are three types of init functions:
class_init
==========
This lives in (TypeInit) and is called when a class is first created for a type.
It is only ever called once. Within this function, you should override any
methods in your base classes and set default implementations for any methods you
implement.
instance_init
=============
This is the constructor for a type. It is called when an object is created and
chained such that the base class constructors are called first to initialize the
object.
DeviceState::init
=================
This is the qdev initialize function. It is called sometime after properties
are set and before the guest starts running for the first time. Long term, I
plan to change this to "DeviceState::realize" and remove explicit calls to
qdev_init() in favor of a propagated realize signal.
But for now, I'm trying to avoid churn in the tree.
On one hand mm-serial.c calls its superclass init function,
on the other hand isa-bus.c:isa_qdev_init() calls an init function
that its child class must provide. One is calling its parent, the
other is calling its child. Is there a consistent way of doing this
and what did I miss :)?
Yes, this is all DeviceState::init. This is what is called when you invoke
qdev_init(). Right now, you have to do it explicitly and in the case of
composition, since the device is creating another device, it must be the one
that calls qdev_init() for that device.
In the case of inheritance, we're just calling the superclass's init function
because DeviceState::init is just a normal method so we have to explicitly chain
it if we want that behavior.
Regards,
Anthony Liguori
Stefan