Message ID | 20201029220246.472693-28-ehabkost@redhat.com |
---|---|
State | New |
Headers | show |
Series | Make qdev static property API usable by any QOM type | expand |
On Fri, Oct 30, 2020 at 2:23 AM Eduardo Habkost <ehabkost@redhat.com> wrote: > Instead of duplicating the code that sets name, info, offset, > and does type checking, make DEFINE_PROP accept a variable number > of arguments and reuse it in all DEFINE_PROP_* macros. > > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> > neat! and clever? ;) Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: "Daniel P. Berrangé" <berrange@redhat.com> > Cc: Eduardo Habkost <ehabkost@redhat.com> > Cc: qemu-devel@nongnu.org > --- > include/hw/qdev-properties.h | 132 ++++++++++++----------------------- > 1 file changed, 45 insertions(+), 87 deletions(-) > > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h > index 3a7b4c8643..f9a4c132e7 100644 > --- a/include/hw/qdev-properties.h > +++ b/include/hw/qdev-properties.h > @@ -62,73 +62,46 @@ extern const PropertyInfo qdev_prop_uuid; > extern const PropertyInfo qdev_prop_arraylen; > extern const PropertyInfo qdev_prop_link; > > -#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ > +#define DEFINE_PROP(_name, _state, _field, _prop, _type, ...) { \ > .name = (_name), \ > .info = &(_prop), \ > .offset = offsetof(_state, _field) \ > + type_check(_type, typeof_field(_state, _field)), \ > + __VA_ARGS__ \ > } > > -#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) > { \ > - .name = (_name), \ > - .info = &(_prop), \ > - .offset = offsetof(_state, _field) \ > - + type_check(_type,typeof_field(_state, _field)), \ > - .set_default = true, \ > - .defval.i = (_type)_defval, \ > - } > +#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) \ > + DEFINE_PROP(_name, _state, _field, _prop, _type, \ > + .set_default = true, \ > + .defval.i = (_type)_defval) > > -#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) > { \ > - .name = (_name), \ > - .info = &(_prop), \ > - .offset = offsetof(_state, _field) \ > - + type_check(_type, typeof_field(_state, _field)), \ > - } > +#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) > \ > + DEFINE_PROP(_name, _state, _field, _prop, _type) > > -#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \ > - .name = (_name), \ > - .info = &(qdev_prop_bit), \ > - .bitnr = (_bit), \ > - .offset = offsetof(_state, _field) \ > - + type_check(uint32_t,typeof_field(_state, _field)), \ > - .set_default = true, \ > - .defval.u = (bool)_defval, \ > - } > +#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_bit, uint32_t, \ > + .bitnr = (_bit), \ > + .set_default = true, \ > + .defval.u = (bool)_defval) > > -#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, > _type) { \ > - .name = (_name), \ > - .info = &(_prop), \ > - .offset = offsetof(_state, _field) \ > - + type_check(_type, typeof_field(_state, _field)), \ > - .set_default = true, \ > - .defval.u = (_type)_defval, \ > - } > +#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, > _type) \ > + DEFINE_PROP(_name, _state, _field, _prop, _type, > \ > + .set_default = true, > \ > + .defval.u = (_type)_defval) > > -#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, > _type) { \ > - .name = (_name), \ > - .info = &(_prop), \ > - .offset = offsetof(_state, _field) \ > - + type_check(_type, typeof_field(_state, _field)), \ > - } > +#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, > _type) \ > + DEFINE_PROP(_name, _state, _field, _prop, _type) > > -#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) { \ > - .name = (_name), \ > - .info = &(qdev_prop_bit64), \ > - .bitnr = (_bit), \ > - .offset = offsetof(_state, _field) \ > - + type_check(uint64_t, typeof_field(_state, _field)), \ > - .set_default = true, \ > - .defval.u = (bool)_defval, \ > - } > +#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_bit64, uint64_t, \ > + .bitnr = (_bit), \ > + .set_default = true, \ > + .defval.u = (bool)_defval) > > -#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) { \ > - .name = (_name), \ > - .info = &(qdev_prop_bool), \ > - .offset = offsetof(_state, _field) \ > - + type_check(bool, typeof_field(_state, _field)), \ > - .set_default = true, \ > - .defval.u = (bool)_defval, \ > - } > +#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \ > + .set_default = true, \ > + .defval.u = (bool)_defval) > > #define PROP_ARRAY_LEN_PREFIX "len-" > > @@ -156,26 +129,19 @@ extern const PropertyInfo qdev_prop_link; > * It is the responsibility of the device deinit code to free the > * @_arrayfield memory. > */ > -#define DEFINE_PROP_ARRAY(_name, _state, _field, \ > - _arrayfield, _arrayprop, _arraytype) { \ > - .name = (PROP_ARRAY_LEN_PREFIX _name), \ > - .info = &(qdev_prop_arraylen), \ > - .set_default = true, \ > - .defval.u = 0, \ > - .offset = offsetof(_state, _field) \ > - + type_check(uint32_t, typeof_field(_state, _field)), \ > - .arrayinfo = &(_arrayprop), \ > - .arrayfieldsize = sizeof(_arraytype), \ > - .arrayoffset = offsetof(_state, _arrayfield), \ > - } > +#define DEFINE_PROP_ARRAY(_name, _state, _field, \ > + _arrayfield, _arrayprop, _arraytype) \ > + DEFINE_PROP((PROP_ARRAY_LEN_PREFIX _name), \ > + _state, _field, qdev_prop_arraylen, uint32_t, \ > + .set_default = true, \ > + .defval.u = 0, \ > + .arrayinfo = &(_arrayprop), \ > + .arrayfieldsize = sizeof(_arraytype), \ > + .arrayoffset = offsetof(_state, _arrayfield)) > > -#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) { \ > - .name = (_name), \ > - .info = &(qdev_prop_link), \ > - .offset = offsetof(_state, _field) \ > - + type_check(_ptr_type, typeof_field(_state, _field)), \ > - .link_type = _type, \ > - } > +#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_link, _ptr_type, \ > + .link_type = _type) > > #define DEFINE_PROP_UINT8(_n, _s, _f, _d) \ > DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint8, uint8_t) > @@ -197,19 +163,11 @@ extern const PropertyInfo qdev_prop_link; > DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto) > #define DEFINE_PROP_SIZE32(_n, _s, _f, _d) \ > DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t) > -#define DEFINE_PROP_UUID(_name, _state, _field) { \ > - .name = (_name), \ > - .info = &qdev_prop_uuid, \ > - .offset = offsetof(_state, _field) \ > - + type_check(QemuUUID, typeof_field(_state, _field)), \ > - .set_default = true, \ > - } > -#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) { \ > - .name = (_name), \ > - .info = &qdev_prop_uuid, \ > - .offset = offsetof(_state, _field) \ > - + type_check(QemuUUID, typeof_field(_state, _field)), \ > - } > +#define DEFINE_PROP_UUID(_name, _state, _field) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID, \ > + .set_default = true) > +#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) \ > + DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID) > > #define DEFINE_PROP_END_OF_LIST() \ > {} > -- > 2.28.0 > > >
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index 3a7b4c8643..f9a4c132e7 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -62,73 +62,46 @@ extern const PropertyInfo qdev_prop_uuid; extern const PropertyInfo qdev_prop_arraylen; extern const PropertyInfo qdev_prop_link; -#define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ +#define DEFINE_PROP(_name, _state, _field, _prop, _type, ...) { \ .name = (_name), \ .info = &(_prop), \ .offset = offsetof(_state, _field) \ + type_check(_type, typeof_field(_state, _field)), \ + __VA_ARGS__ \ } -#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) { \ - .name = (_name), \ - .info = &(_prop), \ - .offset = offsetof(_state, _field) \ - + type_check(_type,typeof_field(_state, _field)), \ - .set_default = true, \ - .defval.i = (_type)_defval, \ - } +#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) \ + DEFINE_PROP(_name, _state, _field, _prop, _type, \ + .set_default = true, \ + .defval.i = (_type)_defval) -#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) { \ - .name = (_name), \ - .info = &(_prop), \ - .offset = offsetof(_state, _field) \ - + type_check(_type, typeof_field(_state, _field)), \ - } +#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) \ + DEFINE_PROP(_name, _state, _field, _prop, _type) -#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \ - .name = (_name), \ - .info = &(qdev_prop_bit), \ - .bitnr = (_bit), \ - .offset = offsetof(_state, _field) \ - + type_check(uint32_t,typeof_field(_state, _field)), \ - .set_default = true, \ - .defval.u = (bool)_defval, \ - } +#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_bit, uint32_t, \ + .bitnr = (_bit), \ + .set_default = true, \ + .defval.u = (bool)_defval) -#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, _type) { \ - .name = (_name), \ - .info = &(_prop), \ - .offset = offsetof(_state, _field) \ - + type_check(_type, typeof_field(_state, _field)), \ - .set_default = true, \ - .defval.u = (_type)_defval, \ - } +#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, _type) \ + DEFINE_PROP(_name, _state, _field, _prop, _type, \ + .set_default = true, \ + .defval.u = (_type)_defval) -#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, _type) { \ - .name = (_name), \ - .info = &(_prop), \ - .offset = offsetof(_state, _field) \ - + type_check(_type, typeof_field(_state, _field)), \ - } +#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, _type) \ + DEFINE_PROP(_name, _state, _field, _prop, _type) -#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) { \ - .name = (_name), \ - .info = &(qdev_prop_bit64), \ - .bitnr = (_bit), \ - .offset = offsetof(_state, _field) \ - + type_check(uint64_t, typeof_field(_state, _field)), \ - .set_default = true, \ - .defval.u = (bool)_defval, \ - } +#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_bit64, uint64_t, \ + .bitnr = (_bit), \ + .set_default = true, \ + .defval.u = (bool)_defval) -#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) { \ - .name = (_name), \ - .info = &(qdev_prop_bool), \ - .offset = offsetof(_state, _field) \ - + type_check(bool, typeof_field(_state, _field)), \ - .set_default = true, \ - .defval.u = (bool)_defval, \ - } +#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_bool, bool, \ + .set_default = true, \ + .defval.u = (bool)_defval) #define PROP_ARRAY_LEN_PREFIX "len-" @@ -156,26 +129,19 @@ extern const PropertyInfo qdev_prop_link; * It is the responsibility of the device deinit code to free the * @_arrayfield memory. */ -#define DEFINE_PROP_ARRAY(_name, _state, _field, \ - _arrayfield, _arrayprop, _arraytype) { \ - .name = (PROP_ARRAY_LEN_PREFIX _name), \ - .info = &(qdev_prop_arraylen), \ - .set_default = true, \ - .defval.u = 0, \ - .offset = offsetof(_state, _field) \ - + type_check(uint32_t, typeof_field(_state, _field)), \ - .arrayinfo = &(_arrayprop), \ - .arrayfieldsize = sizeof(_arraytype), \ - .arrayoffset = offsetof(_state, _arrayfield), \ - } +#define DEFINE_PROP_ARRAY(_name, _state, _field, \ + _arrayfield, _arrayprop, _arraytype) \ + DEFINE_PROP((PROP_ARRAY_LEN_PREFIX _name), \ + _state, _field, qdev_prop_arraylen, uint32_t, \ + .set_default = true, \ + .defval.u = 0, \ + .arrayinfo = &(_arrayprop), \ + .arrayfieldsize = sizeof(_arraytype), \ + .arrayoffset = offsetof(_state, _arrayfield)) -#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) { \ - .name = (_name), \ - .info = &(qdev_prop_link), \ - .offset = offsetof(_state, _field) \ - + type_check(_ptr_type, typeof_field(_state, _field)), \ - .link_type = _type, \ - } +#define DEFINE_PROP_LINK(_name, _state, _field, _type, _ptr_type) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_link, _ptr_type, \ + .link_type = _type) #define DEFINE_PROP_UINT8(_n, _s, _f, _d) \ DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint8, uint8_t) @@ -197,19 +163,11 @@ extern const PropertyInfo qdev_prop_link; DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto) #define DEFINE_PROP_SIZE32(_n, _s, _f, _d) \ DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size32, uint32_t) -#define DEFINE_PROP_UUID(_name, _state, _field) { \ - .name = (_name), \ - .info = &qdev_prop_uuid, \ - .offset = offsetof(_state, _field) \ - + type_check(QemuUUID, typeof_field(_state, _field)), \ - .set_default = true, \ - } -#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) { \ - .name = (_name), \ - .info = &qdev_prop_uuid, \ - .offset = offsetof(_state, _field) \ - + type_check(QemuUUID, typeof_field(_state, _field)), \ - } +#define DEFINE_PROP_UUID(_name, _state, _field) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID, \ + .set_default = true) +#define DEFINE_PROP_UUID_NODEFAULT(_name, _state, _field) \ + DEFINE_PROP(_name, _state, _field, qdev_prop_uuid, QemuUUID) #define DEFINE_PROP_END_OF_LIST() \ {}
Instead of duplicating the code that sets name, info, offset, and does type checking, make DEFINE_PROP accept a variable number of arguments and reuse it in all DEFINE_PROP_* macros. Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: "Daniel P. Berrangé" <berrange@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: qemu-devel@nongnu.org --- include/hw/qdev-properties.h | 132 ++++++++++++----------------------- 1 file changed, 45 insertions(+), 87 deletions(-)