Am 03.12.2020 um 12:11 hat Paolo Bonzini geschrieben:
On 02/12/20 18:35, Kevin Wolf wrote:
> > Could we have an intermediate state that doesn't require any
> > duplication and thus have no separate code paths that could
> > diverge?
>
> The one requirement we have for an intermediate state is that it
> supports both interfaces: The well-know create/set properties/realize
> dance, and a new DeviceClass method, say .create(), that takes the
> configuration in parameters instead of relying on previously set
> properties.
>
> I assumed two separate implementations of transferring the configuration
> into the internal state. On second thought, this assumption is maybe
> wrong.
>
> You can implement the new method as wrapper around the old way: It could
> just set all the properties and call realize. Of course, you don't win
> much in terms of improving the class implementation this way, but just
> support the new interface, but I guess it can be a reasonable
> intermediate step to resolve complicated dependencies etc.
I sketched something at
https://wiki.qemu.org/Features/QOM-QAPI_integration.
The main difference with what we discussed so far is that it doesn't subsume
the complete/realize step, only the setting of properties. The idea is that
user_creatable_add_type does the following:
- calls an oc->configure method on every superclass of the object
- takes what's left of the input visitor and uses it to set properties
- then calls ucc->complete
So in the end the only new step is the first. If the first two steps are
bundled in a new function object_configure, they can be reused for devices,
machines and accelerators.
The QAPI code generator can also easily wrap them into a C API for QOM
object creation.
I glossed completely over the generation of properties within the QAPI code
generator. Making properties read-only (or, in the field-properties world,
having a default allow_set of "return false") is already a nice improvement
over
I don't think this is an intermediate state like Eduardo wants to have.
Creating the object, then setting properties, then realize [1] will fail
after your change. But keeping it working was the whole point of the
exercise.
I'm also not really sure why you go from RngEgdOptions to QObject to a
visitor, only to reconstruct RngEgdOptions at the end. I think the class
implementations should have a normal C interface without visitors and we
should be able to just pass the existing RngEgdOptions object (or the
individual values for its fields for 'boxed': false).
Kevin
[1] Or complete for ucc, but the number of these is small enough that we
don't really need any intermediate state, except maybe as a proof of
concept for the later qdev conversion.