qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Greg Kurz <groug@kaod.org>
Subject: [PULL 31/87] object: Improve documentation of interfaces
Date: Wed, 18 Dec 2019 13:01:57 +0100	[thread overview]
Message-ID: <1576670573-48048-32-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1576670573-48048-1-git-send-email-pbonzini@redhat.com>

From: Greg Kurz <groug@kaod.org>

QOM interfaces allow a limited form of multiple inheritance, at the
condition of being stateless. That is, they cannot be instantiated
and a pointer to an interface shouldn't be dereferenceable in any way.
This is achieved by making the QOM instance type an incomplete type,
which is, as mentioned by Markus Armbruster, the closest you can get
to abstract class in C.

Incomplete types are widely used to hide implementation details, but
people usually expect to find at least one place where the type is
fully defined. The fact that it doesn't happen with QOM interfaces is
quite disturbing, especially since it isn't documented anywhere as
recently discussed in this thread:

https://lists.gnu.org/archive/html/qemu-devel/2019-12/msg01579.html

Amend the documentation in the object.h header file to provide more
details about why and how to implement QOM interfaces using incomplete
types.

Signed-off-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/qom/object.h | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index f9ad692..bd68d19 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -200,8 +200,14 @@ typedef struct InterfaceInfo InterfaceInfo;
  *
  * Interfaces allow a limited form of multiple inheritance.  Instances are
  * similar to normal types except for the fact that are only defined by
- * their classes and never carry any state.  You can dynamically cast an object
- * to one of its #Interface types and vice versa.
+ * their classes and never carry any state.  As a consequence, a pointer to
+ * an interface instance should always be of incomplete type in order to be
+ * sure it cannot be dereferenced.  That is, you should define the
+ * 'typedef struct SomethingIf SomethingIf' so that you can pass around
+ * 'SomethingIf *si' arguments, but not define a 'struct SomethingIf { ... }'.
+ * The only things you can validly do with a 'SomethingIf *' are to pass it as
+ * an argument to a method on its corresponding SomethingIfClass, or to
+ * dynamically cast it to an object that implements the interface.
  *
  * # Methods #
  *
-- 
1.8.3.1




  parent reply	other threads:[~2019-12-18 12:25 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-18 12:01 [PULL 00/87] Misc patches for 2019-12-18 Paolo Bonzini
2019-12-18 12:01 ` [PULL 01/87] kvm: Reallocate dirty_bmap when we change a slot Paolo Bonzini
2019-12-18 12:01 ` [PULL 02/87] migration-test: Create cmd_soure and cmd_target Paolo Bonzini
2019-12-18 12:01 ` [PULL 03/87] migration-test: Move hide_stderr to common commandline Paolo Bonzini
2019-12-18 12:01 ` [PULL 04/87] migration-test: Move -machine " Paolo Bonzini
2019-12-18 12:01 ` [PULL 05/87] migration-test: Move memory size " Paolo Bonzini
2019-12-18 12:01 ` [PULL 06/87] migration-test: Move shmem handling " Paolo Bonzini
2019-12-18 12:01 ` [PULL 07/87] migration-test: Move -name " Paolo Bonzini
2019-12-18 12:01 ` [PULL 08/87] migration-test: Move -serial " Paolo Bonzini
2019-12-18 12:01 ` [PULL 09/87] migration-test: Move -incomming " Paolo Bonzini
2019-12-18 12:01 ` [PULL 10/87] migration-test: Rename cmd_src/dst to arch_source/arch_target Paolo Bonzini
2019-12-18 12:01 ` [PULL 11/87] migration-test: Use a struct for test_migrate_start parameters Paolo Bonzini
2019-12-18 12:01 ` [PULL 12/87] memory: do not look at current_machine->accel Paolo Bonzini
2019-12-18 12:01 ` [PULL 13/87] vl: move icount configuration earlier Paolo Bonzini
2019-12-18 12:01 ` [PULL 14/87] tcg: move qemu_tcg_configure to accel/tcg/tcg-all.c Paolo Bonzini
2019-12-18 12:01 ` [PULL 15/87] vl: extract accelerator option processing to a separate function Paolo Bonzini
2019-12-18 12:01 ` [PULL 16/87] vl: merge -accel processing into configure_accelerators Paolo Bonzini
2019-12-18 12:01 ` [PULL 17/87] accel: compile accel/accel.c just once Paolo Bonzini
2019-12-18 12:01 ` [PULL 18/87] vl: introduce object_parse_property_opt Paolo Bonzini
2019-12-18 12:01 ` [PULL 19/87] vl: configure accelerators from -accel options Paolo Bonzini
2019-12-18 12:01 ` [PULL 20/87] vl: warn for unavailable accelerators, clarify messages Paolo Bonzini
2020-01-16 14:50   ` Laurent Vivier
2020-01-16 15:10     ` Paolo Bonzini
2019-12-18 12:01 ` [PULL 21/87] qom: introduce object_register_sugar_prop Paolo Bonzini
2019-12-18 12:01 ` [PULL 22/87] qom: add object_new_with_class Paolo Bonzini
2019-12-18 12:01 ` [PULL 23/87] accel: pass object to accel_init_machine Paolo Bonzini
2019-12-18 12:01 ` [PULL 24/87] tcg: convert "-accel threads" to a QOM property Paolo Bonzini
2019-12-18 12:01 ` [PULL 25/87] tcg: add "-accel tcg,tb-size" and deprecate "-tb-size" Paolo Bonzini
2019-12-18 12:01 ` [PULL 26/87] xen: convert "-machine igd-passthru" to an accelerator property Paolo Bonzini
2019-12-18 12:01 ` [PULL 27/87] kvm: convert "-machine kvm_shadow_mem" " Paolo Bonzini
2019-12-18 12:01 ` [PULL 28/87] kvm: introduce kvm_kernel_irqchip_* functions Paolo Bonzini
2019-12-18 12:01 ` [PULL 29/87] kvm: convert "-machine kernel_irqchip" to an accelerator property Paolo Bonzini
2020-01-07 14:46   ` Peter Maydell
2020-01-07 16:18     ` Paolo Bonzini
2019-12-18 12:01 ` [PULL 30/87] Makefile: remove unused variables Paolo Bonzini
2019-12-18 12:01 ` Paolo Bonzini [this message]
2019-12-18 12:01 ` [PULL 32/87] build-sys: build vhost-user-gpu only if CONFIG_TOOLS Paolo Bonzini
2019-12-18 12:01 ` [PULL 33/87] build-sys: do not include Windows SLIRP dependencies in $LIBS Paolo Bonzini
2019-12-18 12:02 ` [PULL 34/87] migration: fix maybe-uninitialized warning Paolo Bonzini
2019-12-18 12:02 ` [PULL 35/87] monitor: fix maybe-uninitialized Paolo Bonzini
2019-12-18 12:02 ` [PULL 36/87] vhost-user-scsi: fix printf format warning Paolo Bonzini
2019-12-18 12:02 ` [PULL 37/87] os-posix: simplify os_find_datadir Paolo Bonzini
2019-12-18 12:02 ` [PULL 38/87] tests: skip block layer tests if !CONFIG_TOOLS Paolo Bonzini
2019-12-18 12:02 ` [PULL 39/87] libvixl: remove per-target compiler flags Paolo Bonzini
2019-12-18 12:02 ` [PULL 40/87] crypto: move common bits for all emulators to libqemuutil Paolo Bonzini
2019-12-18 12:02 ` [PULL 41/87] stubs: replace stubs with lnot if applicable Paolo Bonzini
2019-12-18 12:02 ` [PULL 42/87] configure: set $PYTHON to a full path Paolo Bonzini
2019-12-18 12:02 ` [PULL 43/87] configure: simplify vhost condition with Kconfig Paolo Bonzini
2019-12-18 12:02 ` [PULL 44/87] i386: conditionally compile more files Paolo Bonzini
2019-12-18 12:02 ` [PULL 45/87] fw_cfg: allow building without other devices Paolo Bonzini
2019-12-18 12:02 ` [PULL 46/87] hw: replace hw/i386/pc.h with a header just for the i8259 Paolo Bonzini
2019-12-18 12:02 ` [PULL 47/87] pci-stub: add more MSI functions Paolo Bonzini
2019-12-18 12:02 ` [PULL 48/87] x86: move SMM property to X86MachineState Paolo Bonzini
2019-12-23 11:28   ` Michal Prívozník
2019-12-23 11:33     ` Daniel P. Berrangé
2019-12-23 11:40       ` Michal Prívozník
2019-12-23 13:38         ` Paolo Bonzini
2019-12-23 14:46           ` Michal Prívozník
2019-12-18 12:02 ` [PULL 49/87] hw/i386/pc: Convert DPRINTF() to trace events Paolo Bonzini
2019-12-18 12:02 ` [PULL 50/87] x86: move more x86-generic functions out of PC files Paolo Bonzini
2019-12-18 12:02 ` [PULL 51/87] acpi: move PC stubs out of stubs/ Paolo Bonzini
2019-12-18 12:02 ` [PULL 52/87] pc: stubify x86 iommu Paolo Bonzini
2019-12-18 12:02 ` [PULL 53/87] hw/i386: De-duplicate gsi_handler() to remove kvm_pc_gsi_handler() Paolo Bonzini
2019-12-18 12:02 ` [PULL 54/87] hw/i386: Simplify ioapic_init_gsi() Paolo Bonzini
2019-12-18 12:02 ` [PULL 55/87] hw/isa/isa-bus: cleanup irq functions Paolo Bonzini
2019-12-18 12:02 ` [PULL 56/87] hw/i386/pc: Use TYPE_PORT92 instead of hardcoded string Paolo Bonzini
2019-12-18 12:02 ` [PULL 57/87] hw/i386/pc: Inline port92_init() Paolo Bonzini
2019-12-18 12:02 ` [PULL 58/87] hw/i386/pc: Extract the port92 device Paolo Bonzini
2019-12-18 12:02 ` [PULL 59/87] hyperv: Use auto rcu_read macros Paolo Bonzini
2019-12-18 12:02 ` [PULL 60/87] qsp: Use WITH_RCU_READ_LOCK_GUARD Paolo Bonzini
2019-12-18 12:02 ` [PULL 61/87] memory: use RCU_READ_LOCK_GUARD Paolo Bonzini
2019-12-18 12:02 ` [PULL 62/87] colo: fix return without releasing RCU Paolo Bonzini
2019-12-18 12:02 ` [PULL 63/87] build: rename CONFIG_LIBCAP to CONFIG_LIBCAP_NG Paolo Bonzini
2019-12-18 12:02 ` [PULL 64/87] docs: import Linux kernel-doc script and extension Paolo Bonzini
2019-12-18 12:02 ` [PULL 65/87] docs: tweak kernel-doc for QEMU coding standards Paolo Bonzini
2019-12-18 12:02 ` [PULL 66/87] docs/conf.py: Enable use of kerneldoc sphinx extension Paolo Bonzini
2019-12-18 12:02 ` [PULL 67/87] Makefile: disable Sphinx nitpicking Paolo Bonzini
2019-12-18 12:02 ` [PULL 68/87] bitops.h: Silence kernel-doc complaints Paolo Bonzini
2019-12-18 12:02 ` [PULL 69/87] docs: Create bitops.rst as example of kernel-docs Paolo Bonzini
2019-12-18 12:02 ` [PULL 70/87] memory.h: Silence kernel-doc complaints Paolo Bonzini
2019-12-18 12:02 ` [PULL 71/87] docs: add memory API reference Paolo Bonzini
2019-12-18 12:02 ` [PULL 72/87] memory: include MemoryListener documentation and some missing function parameters Paolo Bonzini
2019-12-18 12:02 ` [PULL 73/87] migration: check length directly to make sure the range is aligned Paolo Bonzini
2019-12-18 12:02 ` [PULL 74/87] WHPX: refactor load library Paolo Bonzini
2019-12-18 12:02 ` [PULL 75/87] target/i386: remove unused pci-assign codes Paolo Bonzini
2019-12-18 12:02 ` [PULL 76/87] Fix some comment spelling errors Paolo Bonzini
2019-12-18 12:02 ` [PULL 77/87] hw/pci-host/i440fx: Correct the header description Paolo Bonzini
2019-12-18 12:02 ` [PULL 78/87] hw/pci-host/i440fx: Extract PCII440FXState to "hw/pci-host/i440fx.h" Paolo Bonzini
2019-12-18 12:02 ` [PULL 79/87] hw/pci-host/i440fx: Use size_t to iterate over ARRAY_SIZE() Paolo Bonzini
2019-12-18 12:02 ` [PULL 80/87] hw/pci-host/i440fx: Use definitions instead of magic values Paolo Bonzini
2019-12-18 12:02 ` [PULL 81/87] hw/pci-host/i440fx: Extract the IGD passthrough host bridge device Paolo Bonzini
2019-12-18 12:02 ` [PULL 82/87] hw/pci-host: Add Kconfig entry to select the IGD Passthrough Host Bridge Paolo Bonzini
2019-12-18 12:02 ` [PULL 83/87] hw/i386: Remove the deprecated machines 0.12 up to 0.15 Paolo Bonzini
2019-12-18 12:02 ` [PULL 84/87] hw/audio: Remove the "use_broken_id" hack from the AC97 device Paolo Bonzini
2019-12-18 12:02 ` [PULL 85/87] hw/pci: Remove the "command_serr_enable" property Paolo Bonzini
2019-12-18 12:02 ` [PULL 86/87] hw/display: Remove "rombar" hack from vga-pci and vmware_vga Paolo Bonzini
2019-12-18 12:02 ` [PULL 87/87] vga: cleanup mapping of VRAM for non-PCI VGA Paolo Bonzini
2019-12-20 12:45 ` [PULL 00/87] Misc patches for 2019-12-18 Peter Maydell

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=1576670573-48048-32-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=groug@kaod.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).