qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3 21/22] qidl: qidl.h, definitions for qidl ann


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v3 21/22] qidl: qidl.h, definitions for qidl annotations
Date: Fri, 05 Oct 2012 17:07:46 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120911 Thunderbird/15.0.1

Il 04/10/2012 19:33, Michael Roth ha scritto:
> Signed-off-by: Michael Roth <address@hidden>
> ---
>  qidl.h |  113 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 113 insertions(+)
>  create mode 100644 qidl.h
> 
> diff --git a/qidl.h b/qidl.h
> new file mode 100644
> index 0000000..eae0202
> --- /dev/null
> +++ b/qidl.h
> @@ -0,0 +1,113 @@
> +/*
> + * QEMU IDL Macros/stubs
> + *
> + * See docs/qidl.txt for usage information.
> + *
> + * Copyright IBM, Corp. 2012
> + *
> + * Authors:
> + *  Michael Roth    <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU GPLv2 or later.
> + * See the COPYING file in the top-level directory.
> + *
> + */
> +
> +#ifndef QIDL_H
> +#define QIDL_H
> +
> +#include <glib.h>
> +#include "qapi/qapi-visit-core.h"
> +#include "qemu/object.h"
> +#include "hw/qdev-properties.h"
> +
> +#ifdef QIDL_GEN
> +
> +/* we pass the code through the preprocessor with QIDL_GEN defined to parse
> + * structures as they'd appear after preprocessing, and use the following
> + * definitions mostly to re-insert the initial macros/annotations so they
> + * stick around for the parser to process
> + */
> +#define QIDL(...) QIDL(__VA_ARGS__)
> +#define QIDL_START(name, ...) QIDL_START(name, ##__VA_ARGS__)
> +
> +#define QIDL_VISIT_TYPE(name, v, s, f, e)
> +#define QIDL_SCHEMA_ADD_LINK(name, obj, path, errp)
> +#define QIDL_PROPERTIES(name)

Ok, a few questions...

Why do you need these to expand to nothing in the QIDL_GEN case?

> +#define QIDL_DECLARE(name, ...) \

Can QIDL_DECLARE replace QIDL_ENABLED as the magic detection string for
qidl compilation?

> +    QIDL_START(name, ##__VA_ARGS__) \
> +    struct name
> +
> +#else /* !QIDL_GEN */
> +
> +#define QIDL(...)
> +#ifdef QIDL_ENABLED
> +#define QIDL_START(name, ...) \
> +    static struct { \
> +        void (*visitor)(Visitor *, struct name **, const char *, Error **); \
> +        const char *schema_json_text; \
> +        Object *schema_obj; \
> +        Property *properties; \
> +    } qidl_data_##name;
> +#else
> +#define QIDL_START(name,  ...)
> +#endif
> +
> +#define QIDL_DECLARE(name, ...) \
> +    QIDL_START(name, ##__VA_ARGS__) \
> +    struct name

This is the same definition as in the QIDL_GEN case.  Please include it
just once.

> +#define QIDL_VISIT_TYPE(name, v, s, f, e) \
> +    g_assert(qidl_data_##name.visitor); \
> +    qidl_data_##name.visitor(v, s, NULL, e)
> +
> +#define QIDL_SCHEMA_ADD_LINK(name, obj, path, errp) \
> +    g_assert(qidl_data_##name.schema_obj); \
> +    object_property_add_link(obj, path, "container", \
> +                             &qidl_data_##name.schema_obj, errp)

Where will QIDL_SCHEMA_ADD_LINK be used?

> +#define QIDL_PROPERTIES(name) \
> +    qidl_data_##name.properties
> +
> +#endif /* QIDL_GEN */
> +
> +/* must be "called" in any C files that make use of QIDL-generated code */
> +#define QIDL_ENABLE()
> +
> +/* QIDL annotations/markers
> + *
> + * q_immutable: state is fully restorable via device
> + *   [re-]initialization/realization
> + *
> + * q_derived: state can be fully reconstructed from other fields (and will 
> be,
> + *   via [re-]initialization of the device or a separate hook)
> + *
> + * q_broken: state should (or possibly should) be saved, but isn't. mostly 
> an aid
> + *   for device developers having issues with serialization of a particular
> + *   field, committed code should contain these except in special 
> circumstances
> + *
> + * q_optional: <field> should only be serialized if the field by the name of
> + *   has_<field> is true
> + *
> + * q_elsewhere: state should be serialized, but is done so elsewhere (for
> + *   instance, by another device with a pointer to the same data)
> + *
> + * q_size(field): for static/dynamically-allocated arrays. specifies the 
> field
> + *   in the structure containing the number of elements that should be
> + *   serialized. if argument is wrapped in parenthesis it is instead 
> interpreted
> + *   as an expression that should be invaluated to determine the size.
> + *
> + * q_property(<property name> [, <default value>]): specifies that field is a
> + *   qdev-style property. all properties of the struct are then accessible 
> via
> + *   QIDL_PROPERTIES(<device name>) macro.
> + */
> +
> +#define q_immutable QIDL(immutable)
> +#define q_derived QIDL(derived)
> +#define q_broken QIDL(broken)
> +#define q_optional QIDL(optional)
> +#define q_elsewhere QIDL(elsewhere)
> +#define q_size(...) QIDL(size_is, ##__VA_ARGS__)
> +#define q_property(name, ...) QIDL(property, name, ##__VA_ARGS__)
> +
> +#endif
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]