From: Anthony Liguori <anthony@codemonkey.ws>
To: Jan Kiszka <jan.kiszka@web.de>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Michael S. Tsirkin" <mst@redhat.com>,
qemu-devel@nongnu.org, "Alexander Graf" <agraf@suse.de>,
"Blue Swirl" <blauwirbel@gmail.com>,
"Andreas Färber" <andreas.faerber@web.de>,
qemu-ppc@nongnu.org, "Paul Brook" <paul@codesourcery.com>,
"Aurelien Jarno" <aurelien@aurel32.net>,
"Gerd Hoffmann" <kraxel@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 27/28] sysbus: apic: ioapic: convert to QEMU Object Model
Date: Tue, 24 Jan 2012 17:03:18 -0600 [thread overview]
Message-ID: <4F1F38B6.7000506@codemonkey.ws> (raw)
In-Reply-To: <4F1F2B77.2020703@web.de>
On 01/24/2012 04:06 PM, Jan Kiszka wrote:
> On 2012-01-24 22:53, Anthony Liguori wrote:
>> But I don't like this. The problem is that the declarative syntax we
>> have doesn't distinguish between "not-specified" and
>> "zero-initialized".
>
> That's surely solvable.
Please try :-)
I've spent a good chunk of time mulling this over and could not find an
acceptable solution. I think the same is true for the GObject folks.
There is a declarative solution for this that I know of, a C++ class definition ;-)
>> It's also tempting to just drop the if (ti->reset)
>> check but that means that you unconditionally override the base class
>> implementation even if it's not specified.
>
> That as well, just wrap this repeating pattern in a macro.
I'm fairly certain that would be hideous.
>> I don't see any tangible benefits to a declarative syntax except that it
>> makes it harder to get right because you have to write per-base class
>> initialization functions and it's very easy to get polymorphism wrong
>> there.
>
> Now you have to write way more derived class init functions - provided a
> base class is used more than once.
I don't understand why that's a problem.
>> We're not talking about a code size difference. It's a wash in terms of
>> number of lines of code.
>
> We are. Code size will be smaller, so the number of lines. How much,
> that depends on the number of users per base class.
Compare:
static void my_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
dc->reset = my_device_reset;
}
static TypeInfo my_device_type_info = {
.name = TYPE_MY_DEVICE,
.parent = TYPE_DEVICE,
.class_init = my_device_class_init,
};
static void register_devices(void)
{
type_register_static(&my_device_type_info);
}
To:
static DeviceTypeInfo my_device_ops = {
.reset = my_device_reset,
};
static TypeInfo my_device_type_info = {
.name = TYPE_MY_DEVICE,
.parent = TYPE_DEVICE,
.class_init = device_generic_init,
.class_data = my_device_ops,
};
static void register_devices(void)
{
type_register_static(&my_device_type_info);
}
They're exactly the same size (16 lines). If you embed TypeInfo into
DeviceTypeInfo, and introduce a Device specific type registration function, then
you could do:
static DeviceTypeInfo my_device_type_info = {
.type.name = TYPE_MY_DEVICE,
.type.parent = TYPE_PARENT_DEVICE,
.reset = my_device_reset,
};
static void register_devices(void)
{
device_type_register_static(&my_device_type_info);
}
Which admittedly saves 6 lines, but also is a big step backwards IMHO. Now
you've got a lot of one-off functions which means you loose the advantage of
having everything work through the same infrastructure. The likelihood that
someone is going to do something whacky in device_type_register_static is high
IMHO. I think parent initialization (.type.name) is ugly.
Plus, if you do need a class_init function (if you want to save off the super
class value for some function), then you need to revert back to style (1) anyway.
It'll never get better than this. The 6 line difference is fixed and is mostly
whitespace/curly brackets.
>>
>> Imperative allows you to explicit zero-initialize, accept the previous
>> version (from the base class), or override with a new value.
>
> None of this is impossible with a declarative approach.
The class_data method would allow for class initialization based on a
declarative description so it will always be possible to add at some point if
someone figures out the ultimate clever way to do it.
Regards,
Anthony Liguori
>
> Jan
>
next prev parent reply other threads:[~2012-01-24 23:03 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-24 19:32 [Qemu-devel] [PATCH v3 0/28] qom: add QEMU Object Model type hierarchy to qdev Anthony Liguori
2012-01-24 19:32 ` [Qemu-devel] [PATCH 01/28] macio: convert " Anthony Liguori
2012-01-26 23:17 ` [Qemu-devel] [PATCH] macio: Convert " Andreas Färber
2012-03-06 22:56 ` Alexander Graf
2012-01-24 19:32 ` [Qemu-devel] [PATCH 02/28] openpic: remove dead code to make a PCI device version Anthony Liguori
2012-01-26 23:57 ` Andreas Färber
2012-01-24 19:32 ` [Qemu-devel] [PATCH 03/28] pci: call reset unconditionally Anthony Liguori
2012-01-25 12:42 ` Michael S. Tsirkin
2012-01-25 13:28 ` Anthony Liguori
2012-01-24 19:32 ` [Qemu-devel] [PATCH 04/28] qom: add the base Object class (v2) Anthony Liguori
2012-01-25 21:30 ` Andreas Färber
2012-01-25 21:37 ` Anthony Liguori
2012-01-26 7:43 ` Paolo Bonzini
2012-01-27 15:05 ` Andreas Färber
2012-01-27 15:42 ` Anthony Liguori
2012-01-27 15:43 ` Andreas Färber
2012-01-24 19:32 ` [Qemu-devel] [PATCH 05/28] qdev: integrate with QEMU Object Model (v2) Anthony Liguori
2012-01-24 19:32 ` [Qemu-devel] [PATCH 06/28] qdev: move qdev->info to class Anthony Liguori
2012-01-24 19:32 ` [Qemu-devel] [PATCH 07/28] qdev: don't access name through info Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 08/28] qdev: use a wrapper to access reset and promote reset to a class method Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 09/28] qdev: add a interface to register subclasses Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 10/28] qdev: add class_init to DeviceInfo Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 11/28] qdev: prepare source tree for code conversion Anthony Liguori
2012-01-26 17:35 ` [Qemu-devel] [PATCH 1/3] es1370: Drop dead code Andreas Färber
2012-01-26 17:35 ` [Qemu-devel] [PATCH 2/3] marvell_88w8618_audio: Use DEFINE_PROP_* macros Andreas Färber
2012-01-26 17:35 ` [Qemu-devel] [PATCH 3/3] qdev: prepare source tree for code conversion Andreas Färber
2012-01-24 19:33 ` [Qemu-devel] [PATCH 12/28] isa: pic: convert to QEMU Object Model Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 13/28] usb: " Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 14/28] ccid: " Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 15/28] ssi: " Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 16/28] i2c: rename i2c_slave -> I2CSlave Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 17/28] i2c: smbus: convert to QEMU Object Model Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 18/28] hda-codec: " Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 19/28] ide: " Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 20/28] scsi: " Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 21/28] spapr: convert to QEMU Object Model (v2) Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 22/28] virtio-serial: convert to QEMU Object Model Anthony Liguori
2012-01-24 19:59 ` Amit Shah
2012-01-24 20:13 ` Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 23/28] unin_pci: Clean up qdev names Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 24/28] unin_pci: Drop duplicate busdev Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 25/28] unin_pci: Drop unused reset handler Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 26/28] pci: convert to QEMU Object Model Anthony Liguori
2012-01-25 12:41 ` Michael S. Tsirkin
2012-01-25 13:34 ` Anthony Liguori
2012-01-24 19:33 ` [Qemu-devel] [PATCH 27/28] sysbus: apic: ioapic: " Anthony Liguori
2012-01-24 20:01 ` Jan Kiszka
2012-01-24 20:21 ` Anthony Liguori
2012-01-24 21:01 ` Jan Kiszka
2012-01-24 21:11 ` Anthony Liguori
2012-01-24 21:31 ` Jan Kiszka
2012-01-24 21:53 ` Anthony Liguori
2012-01-24 22:06 ` Jan Kiszka
2012-01-24 23:03 ` Anthony Liguori [this message]
2012-01-25 8:33 ` Andreas Färber
2012-01-25 12:09 ` Avi Kivity
2012-01-25 13:02 ` Paul Brook
2012-01-25 14:25 ` Anthony Liguori
2012-01-25 8:37 ` Jan Kiszka
2012-01-25 10:15 ` Paolo Bonzini
2012-01-25 10:27 ` Jan Kiszka
2012-01-25 11:15 ` Paolo Bonzini
2012-01-25 14:00 ` Anthony Liguori
2012-01-25 14:23 ` Jan Kiszka
2012-01-25 14:40 ` Anthony Liguori
2012-01-25 15:18 ` Andreas Färber
2012-01-25 15:34 ` Eric Blake
2012-01-24 19:33 ` [Qemu-devel] [PATCH 28/28] virtio-s390: " Anthony Liguori
2012-01-24 23:13 ` [Qemu-devel] [PATCH v3 0/28] qom: add QEMU Object Model type hierarchy to qdev Peter Maydell
2012-01-24 23:16 ` Anthony Liguori
2012-01-25 18:31 ` Blue Swirl
2012-01-25 19:43 ` Anthony Liguori
2012-01-25 20:09 ` Blue Swirl
2012-01-27 17:34 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F1F38B6.7000506@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=agraf@suse.de \
--cc=andreas.faerber@web.de \
--cc=aurelien@aurel32.net \
--cc=blauwirbel@gmail.com \
--cc=jan.kiszka@web.de \
--cc=kraxel@redhat.com \
--cc=mst@redhat.com \
--cc=paul@codesourcery.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).