mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-11 16:00:50 -07:00
There's no reason to do two malloc's for an alternate type visiting
a QAPI struct; let's just inline the struct directly as the C union
branch of the struct.
Surprisingly, no clients were actually using the struct member prior
to this patch outside of the testsuite; an earlier patch in the series
added some testsuite coverage to make the effect of this patch more
obvious.
In qapi.py, c_type() gains a new is_unboxed flag to control when we
are emitting a C struct unboxed within the context of an outer
struct (different from our other two modes of usage with no flags
for normal local variable declarations, and with is_param for adding
'const' in a parameter list). I don't know if there is any more
pythonic way of collapsing the two flags into a single parameter,
as we never have a caller setting both flags at once.
Ultimately, we want to also unbox branches for QAPI unions, but as
that touches a lot more client code, it is better as separate
patches. But since unions and alternates share gen_variants(), I
had to hack in a way to test if we are visiting an alternate type
for setting the is_unboxed flag: look for a non-object branch.
This works because alternates have at least two branches, with at
most one object branch, while unions have only object branches.
The hack will go away in a later patch.
The generated code difference to qapi-types.h is relatively small:
| struct BlockdevRef {
| QType type;
| union { /* union tag is @type */
| void *data;
|- BlockdevOptions *definition;
|+ BlockdevOptions definition;
| char *reference;
| } u;
| };
The corresponding spot in qapi-visit.c calls visit_type_FOO(), which
first calls visit_start_struct() to allocate or deallocate the member
and handle a layer of {} from the JSON stream, then visits the
members. To peel off the indirection and the memory management that
comes with it, we inline this call, then suppress allocation /
deallocation by passing NULL to visit_start_struct(), and adjust the
member visit:
| switch ((*obj)->type) {
| case QTYPE_QDICT:
|- visit_type_BlockdevOptions(v, name, &(*obj)->u.definition, &err);
|+ visit_start_struct(v, name, NULL, 0, &err);
|+ if (err) {
|+ break;
|+ }
|+ visit_type_BlockdevOptions_fields(v, &(*obj)->u.definition, &err);
|+ error_propagate(errp, err);
|+ err = NULL;
|+ visit_end_struct(v, &err);
| break;
| case QTYPE_QSTRING:
| visit_type_str(v, name, &(*obj)->u.reference, &err);
The visit of non-object fields is unchanged.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1455778109-6278-13-git-send-email-eblake@redhat.com>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
|
||
|---|---|---|
| .. | ||
| acpi-test-data | ||
| guest-debug | ||
| image-fuzzer | ||
| libqos | ||
| multiboot | ||
| qapi-schema | ||
| qemu-iotests | ||
| rocker | ||
| tcg | ||
| vmstate-static-checker-data | ||
| .gitignore | ||
| ac97-test.c | ||
| ahci-test.c | ||
| bios-tables-test.c | ||
| boot-order-test.c | ||
| check-block.sh | ||
| check-qdict.c | ||
| check-qfloat.c | ||
| check-qint.c | ||
| check-qjson.c | ||
| check-qlist.c | ||
| check-qom-interface.c | ||
| check-qom-proplist.c | ||
| check-qstring.c | ||
| crypto-tls-x509-helpers.c | ||
| crypto-tls-x509-helpers.h | ||
| device-introspect-test.c | ||
| display-vga-test.c | ||
| drive_del-test.c | ||
| ds1338-test.c | ||
| e1000-test.c | ||
| eepro100-test.c | ||
| endianness-test.c | ||
| es1370-test.c | ||
| fdc-test.c | ||
| fw_cfg-test.c | ||
| hd-geo-test.c | ||
| i440fx-test.c | ||
| i82801b11-test.c | ||
| ide-test.c | ||
| intel-hda-test.c | ||
| io-channel-helpers.c | ||
| io-channel-helpers.h | ||
| ioh3420-test.c | ||
| ipmi-bt-test.c | ||
| ipmi-kcs-test.c | ||
| ipoctal232-test.c | ||
| ivshmem-test.c | ||
| libqtest.c | ||
| libqtest.h | ||
| m48t59-test.c | ||
| Makefile | ||
| ne2000-test.c | ||
| nvme-test.c | ||
| pc-cpu-test.c | ||
| pcnet-test.c | ||
| pkix_asn1_tab.c | ||
| pvpanic-test.c | ||
| q35-test.c | ||
| qemu-iotests-quick.sh | ||
| qom-test.c | ||
| rcutorture.c | ||
| rtc-test.c | ||
| rtl8139-test.c | ||
| spapr-phb-test.c | ||
| tco-test.c | ||
| test-aio.c | ||
| test-base64.c | ||
| test-bitops.c | ||
| test-blockjob-txn.c | ||
| test-coroutine.c | ||
| test-crypto-cipher.c | ||
| test-crypto-hash.c | ||
| test-crypto-secret.c | ||
| test-crypto-tlscredsx509.c | ||
| test-crypto-tlssession.c | ||
| test-cutils.c | ||
| test-hbitmap.c | ||
| test-int128.c | ||
| test-io-channel-buffer.c | ||
| test-io-channel-command.c | ||
| test-io-channel-file.c | ||
| test-io-channel-socket.c | ||
| test-io-channel-tls.c | ||
| test-io-task.c | ||
| test-iov.c | ||
| test-mul64.c | ||
| test-netfilter.c | ||
| test-opts-visitor.c | ||
| test-qdev-global-props.c | ||
| test-qemu-opts.c | ||
| test-qga.c | ||
| test-qmp-commands.c | ||
| test-qmp-event.c | ||
| test-qmp-input-strict.c | ||
| test-qmp-input-visitor.c | ||
| test-qmp-output-visitor.c | ||
| test-rcu-list.c | ||
| test-rfifolock.c | ||
| test-string-input-visitor.c | ||
| test-string-output-visitor.c | ||
| test-thread-pool.c | ||
| test-throttle.c | ||
| test-timed-average.c | ||
| test-visitor-serialization.c | ||
| test-vmstate.c | ||
| test-write-threshold.c | ||
| test-x86-cpuid.c | ||
| test-xbzrle.c | ||
| tmp105-test.c | ||
| tpci200-test.c | ||
| usb-hcd-ehci-test.c | ||
| usb-hcd-ohci-test.c | ||
| usb-hcd-uhci-test.c | ||
| usb-hcd-xhci-test.c | ||
| vhost-user-bridge.c | ||
| vhost-user-test.c | ||
| virtio-9p-test.c | ||
| virtio-balloon-test.c | ||
| virtio-blk-test.c | ||
| virtio-console-test.c | ||
| virtio-net-test.c | ||
| virtio-rng-test.c | ||
| virtio-scsi-test.c | ||
| virtio-serial-test.c | ||
| vmxnet3-test.c | ||
| wdt_ib700-test.c | ||