On Wed, Oct 21, 2020 at 11:16 AM Markus Armbruster <arm...@redhat.com> wrote:
> Simple unions are simpler than flat unions in the schema, but more > complicated in C and on the QMP wire: there's extra indirection in C > and extra nesting on the wire, both pointless. They should be avoided > in new code. > > GuestDeviceId was recently added for guest-get-devices. Convert it to > a flat union. > > Signed-off-by: Markus Armbruster <arm...@redhat.com> > Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- > qga/qapi-schema.json | 8 ++++++++ > qga/commands-win32.c | 9 ++++----- > 2 files changed, 12 insertions(+), 5 deletions(-) > > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json > index c7bfb8bf6a..fe10631e4c 100644 > --- a/qga/qapi-schema.json > +++ b/qga/qapi-schema.json > @@ -1256,6 +1256,12 @@ > { 'command': 'guest-get-osinfo', > 'returns': 'GuestOSInfo' } > > +## > +# @GuestDeviceType: > +## > +{ 'enum': 'GuestDeviceType', > + 'data': [ 'pci' ] } > + > ## > # @GuestDeviceIdPCI: > # > @@ -1276,6 +1282,8 @@ > # Since: 5.2 > ## > { 'union': 'GuestDeviceId', > + 'base': { 'type': 'GuestDeviceType' }, > + 'discriminator': 'type', > 'data': { 'pci': 'GuestDeviceIdPCI' } } > > ## > diff --git a/qga/commands-win32.c b/qga/commands-win32.c > index 1efe3ba076..0c33d48aaa 100644 > --- a/qga/commands-win32.c > +++ b/qga/commands-win32.c > @@ -2400,16 +2400,15 @@ GuestDeviceInfoList *qmp_guest_get_devices(Error > **errp) > } > skip = false; > > - id = g_new0(GuestDeviceIdPCI, 1); > vendor_id = g_match_info_fetch(match_info, 1); > device_id = g_match_info_fetch(match_info, 2); > - id->vendor_id = g_ascii_strtoull(vendor_id, NULL, 16); > - id->device_id = g_ascii_strtoull(device_id, NULL, 16); > > device->id = g_new0(GuestDeviceId, 1); > device->has_id = true; > - device->id->type = GUEST_DEVICE_ID_KIND_PCI; > - device->id->u.pci.data = id; > + device->id->type = GUEST_DEVICE_TYPE_PCI; > + id = &device->id->u.pci; > + id->vendor_id = g_ascii_strtoull(vendor_id, NULL, 16); > + id->device_id = g_ascii_strtoull(device_id, NULL, 16); > > g_match_info_free(match_info); > break; > -- > 2.26.2 > > > -- Marc-André Lureau