From: Paolo Bonzini <pbonzini@redhat.com>
To: Michael Roth <mdroth@linux.vnet.ibm.com>
Cc: kwolf@redhat.com, peter.maydell@linaro.org, aliguori@us.ibm.com,
qemu-devel@nongnu.org, blauwirbel@gmail.com
Subject: Re: [Qemu-devel] [PATCH v4 24/26] qidl: add QAPI-based code generator
Date: Tue, 16 Oct 2012 09:20:09 +0200 [thread overview]
Message-ID: <507D0AA9.6050204@redhat.com> (raw)
In-Reply-To: <20121015163546.GA27254@illuin>
[-- Attachment #1: Type: text/plain, Size: 2744 bytes --]
Il 15/10/2012 18:35, Michael Roth ha scritto:
>> - immutable/derived/broken/elsewhere (and the default, let's call it
>> serialized) are really five cases of the same QIDL property. Perhaps
>> this could be enforced in the extended syntax like this:
>>
>> #define q_immutable QIDL(serialize(immutable))
>> #define q_derived QIDL(serialize(derived))
>> #define q_broken QIDL(serialize(broken))
>> #define q_elsewhere QIDL(serialize(elsewhere))
>>
>> I would also make it possible to explicitly specify the fifth state, if
>> only for symmetry.
>
> Agreed, that's a more proper grouping. Though, for consistency with
> QIDL(property, ...), I would do QIDL(serialize, ...)
Sure.
>> - it would be _much_ better if you could automatically derive properties
>> information for embedded structs. For example, Notifiers and qemu_irqs
>> are always q_immutable. NotifierLists probably are always q_elsewhere,
>> because the owner of the notifiers should add themselves back.
>
> q_inherit maybe? Otherwise we're overriding "q_default" in subtle
> ways that may not always be desired.
I think the default should be "whatever makes more sense", which for
QIDL_DECLAREd types means making the member q_immutable if it makes
sense for the type.
It's too fragile to expect all subclasses to know whether their
superclass is immutable or has to be serialized, so q_inherit should be
the default. For atomic types, q_inherit is the same as q_serialized.
That said, an alternative is just to never declare the superclass
q_immutable. That would work as long as you do not restrict QIDL to
DeviceState subclasses---see attached patch.
>> In general, if struct X is QIDL_DECLAREd and only has q_immutable
>> fields, it can be taken as q_immutable. Hence for example the base
>> class should not need any decoration; ISADevice will be seen as
>> q_immutable, but PCIDevice will be seen as serialized. But even if a
>> struct is not QIDL_DECLAREd, it should be possible to apply a tag to a
>> typedef, and have it always applied to the members.
Hmm, this wasn't the best choice of words. What I actually meant was
"to apply a tag to a typedef, and have it always applied to members of
that type in other structs". Like
typedef struct Notifier Notifier q_immutable;
Note that Notifier will never have any serializable state, hence it will
not be QIDL_DECLAREd. It is just a proxy that specifies a function to call.
While in principle it is possible to change the function at run-time,
that's not the way that Notifiers are used. That can still be
documented using q_elsewhere, but I think that sane defaults other than
q_serialized are useful to avoid cluttering the declarations. However,
this is a very minor qualm.
Paolo
[-- Attachment #2: 0001-qidl-allow-marking-Object-as-QIDL_DECLARE.patch --]
[-- Type: text/x-patch, Size: 4444 bytes --]
>From 0629eab1d8cff0764d135b85052dd3ba47a1a198 Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <pbonzini@redhat.com>
Date: Tue, 16 Oct 2012 09:19:04 +0200
Subject: [PATCH] qidl: allow marking Object as QIDL_DECLARE
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/isa.h | 8 ++++----
hw/mc146818rtc.c | 2 +-
hw/qdev.h | 28 ++++++++++++++--------------
include/qemu/object.h | 11 ++++++-----
qidl.h | 6 ++----
scripts/qidl.py | 2 +-
6 file modificati, 28 inserzioni(+), 29 rimozioni(-)
diff --git a/hw/isa.h b/hw/isa.h
index 8fb498a..6c7d815 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -31,11 +31,11 @@ struct ISABus {
qemu_irq *irqs;
};
-struct ISADevice {
+QIDL_DECLARE(ISADevice) {
DeviceState qdev;
- uint32_t isairq[2];
- int nirqs;
- int ioport_id;
+ uint32_t q_immutable isairq[2];
+ int q_immutable nirqs;
+ int q_immutable ioport_id;
};
ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io);
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index f5f4bb4..b29cce5 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -62,7 +62,7 @@ QIDL_ENABLE()
typedef struct RTCState RTCState;
QIDL_DECLARE(RTCState) {
- ISADevice q_immutable dev;
+ ISADevice dev;
MemoryRegion q_immutable io;
uint8_t cmos_data[128];
uint8_t cmos_index;
diff --git a/hw/qdev.h b/hw/qdev.h
index 6f2c7f2..3dba377 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -57,22 +57,22 @@ typedef struct DeviceClass {
/* This structure should not be accessed directly. We declare it here
so that it can be embedded in individual device state structures. */
-struct DeviceState {
+QIDL_DECLARE(DeviceState) {
Object parent_obj;
- const char *id;
- enum DevState state;
- QemuOpts *opts;
- int hotplugged;
- BusState *parent_bus;
- int num_gpio_out;
- qemu_irq *gpio_out;
- int num_gpio_in;
- qemu_irq *gpio_in;
- QLIST_HEAD(, BusState) child_bus;
- int num_child_bus;
- int instance_id_alias;
- int alias_required_for_version;
+ const char q_immutable *id;
+ enum DevState q_immutable state;
+ QemuOpts q_immutable *opts;
+ int q_immutable hotplugged;
+ BusState q_immutable *parent_bus;
+ int q_immutable num_gpio_out;
+ qemu_irq q_immutable *gpio_out;
+ int q_immutable num_gpio_in;
+ qemu_irq q_immutable *gpio_in;
+ QLIST_HEAD(, BusState) q_immutable child_bus;
+ int q_immutable num_child_bus;
+ int q_immutable instance_id_alias;
+ int q_immutable alias_required_for_version;
};
#define TYPE_BUS "bus"
diff --git a/include/qemu/object.h b/include/qemu/object.h
index cc75fee..cb4a89b 100644
--- a/include/qemu/object.h
+++ b/include/qemu/object.h
@@ -18,6 +18,7 @@
#include <stdint.h>
#include <stdbool.h>
#include "qemu-queue.h"
+#include "qidl.h"
struct Visitor;
struct Error;
@@ -257,13 +258,13 @@ struct ObjectClass
* #Object also contains a list of #Interfaces that this object
* implements.
*/
-struct Object
+QIDL_DECLARE(Object)
{
/*< private >*/
- ObjectClass *class;
- QTAILQ_HEAD(, ObjectProperty) properties;
- uint32_t ref;
- Object *parent;
+ ObjectClass q_immutable *class;
+ QTAILQ_HEAD(, ObjectProperty) q_immutable properties;
+ uint32_t q_elsewhere ref;
+ Object q_immutable *parent;
};
/**
diff --git a/qidl.h b/qidl.h
index b4c9b02..abff6ba 100644
--- a/qidl.h
+++ b/qidl.h
@@ -18,8 +18,6 @@
#include <glib.h>
#include "qapi/qapi-visit-core.h"
-#include "qemu/object.h"
-#include "hw/qdev-properties.h"
/* must be "called" in any C files that make use of QIDL-generated code */
#define QIDL_ENABLE()
@@ -42,8 +40,8 @@
static struct { \
void (*visitor)(Visitor *, struct name **, const char *, Error **); \
const char *schema_json_text; \
- Object *schema_obj; \
- Property *properties; \
+ struct Object *schema_obj; \
+ struct Property *properties; \
} qidl_data_##name;
#else
#define QIDL_START(name, ...)
diff --git a/scripts/qidl.py b/scripts/qidl.py
index 4e0880e..2544829 100644
--- a/scripts/qidl.py
+++ b/scripts/qidl.py
@@ -240,7 +240,7 @@ def main(argv=[]):
output_filepath = None
schema_filepath = None
- includes = []
+ includes = ["hw/qdev-properties.h"]
for o, a in opts:
if o in ("-f", "--output-filepath"):
output_filepath = a
--
1.7.12.1
next prev parent reply other threads:[~2012-10-16 7:20 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-12 21:10 [Qemu-devel] [PATCH v4 00/26] Add infrastructure for QIDL-based device serialization Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 01/26] qapi: qapi-visit.py -> qapi_visit.py so we can import Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 02/26] qapi: qapi-types.py -> qapi_types.py Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 03/26] qapi: qapi-commands.py -> qapi_commands.py Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 04/26] qapi: qapi_visit.py, make code useable as module Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 05/26] qapi: qapi_visit.py, support arrays and complex qapi definitions Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 06/26] qapi: qapi_visit.py, support generating static functions Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 07/26] qapi: qapi_visit.py, support for visiting non-pointer/embedded structs Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 08/26] qapi: add visitor interfaces for C arrays Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 09/26] qapi: QmpOutputVisitor, implement array handling Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 10/26] qapi: QmpInputVisitor, " Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 11/26] qapi: QmpInputVisitor, don't re-allocate memory in start_struct Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 12/26] qapi: fix potential segfault for visit_type_size() Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 13/26] qapi: ordereddict, add to_json() method Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 14/26] qapi: qapi.py, make json parser more robust Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 15/26] qapi: add open-coded visitor for struct tm types Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 16/26] qapi: Improve existing docs and document annotated QAPI types Michael Roth
2012-10-12 21:10 ` [Qemu-devel] [PATCH v4 17/26] qom-fuse: force single-threaded mode to avoid QMP races Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 18/26] qom-fuse: workaround for truncated properties > 4096 Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 19/26] module additions for schema registration Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 20/26] qdev: move Property-related declarations to qdev-properties.h Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 21/26] qidl: add documentation Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 22/26] qidl: add lexer library (based on QC parser) Michael Roth
2012-10-16 7:26 ` Paolo Bonzini
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 23/26] qidl: add C parser " Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 24/26] qidl: add QAPI-based code generator Michael Roth
2012-10-15 8:12 ` Paolo Bonzini
2012-10-15 13:08 ` Paolo Bonzini
2012-10-15 16:35 ` Michael Roth
2012-10-15 19:37 ` Michael Roth
2012-10-16 7:20 ` Paolo Bonzini [this message]
2012-10-19 3:06 ` Michael Roth
2012-10-19 9:01 ` Paolo Bonzini
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 25/26] qidl: qidl.h, definitions for qidl annotations Michael Roth
2012-10-12 21:11 ` [Qemu-devel] [PATCH v4 26/26] qidl: unit tests and build infrastructure Michael Roth
2012-10-15 10:05 ` Paolo Bonzini
2012-10-15 16:37 ` Michael Roth
2012-10-16 7:21 ` Paolo Bonzini
2012-10-19 3:12 ` Michael Roth
2012-10-15 8:09 ` [Qemu-devel] [PATCH v4 00/26] Add infrastructure for QIDL-based device serialization Paolo Bonzini
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=507D0AA9.6050204@redhat.com \
--to=pbonzini@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=blauwirbel@gmail.com \
--cc=kwolf@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@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).