On 03/28/2018 08:07 AM, Marc-André Lureau wrote:
By moving the common fields to a QObjectCommon, QObject can be a type
which also has a 'base' QObjectCommon field. This allows to write a
generic QOBJECT() macro that will work with any QObject type,
including QObject itself. The container_of() macro ensures that the
object to cast has a QObjectCommon base field, give me some type
safety guarantees. However, for it to work properly, all QObject types
must have 'base' at offset 0 (which is ensured by static checking from
previous patch)
Signed-off-by: Marc-André Lureau <[email protected]>
---
+++ b/include/qapi/qmp/qbool.h
@@ -17,7 +17,7 @@
#include "qapi/qmp/qobject.h"
struct QBool {
- QObject base;
+ struct QObjectCommon base;
Why no 'typedef struct QObjectCommon QObjectCommon' in scope to make
this simpler?
-/* Get the 'base' part of an object */
-#define QOBJECT(obj) (&(obj)->base)
+struct QObject {
+ struct QObjectCommon base;
+};
+
+#define QOBJECT(x) \
+ container_of(&(x)->base, QObject, base)
If I understand correctly, this still causes clang complaints when
called as QOBJECT(NULL). As long as we are touching this, should we
improve this macro to be friendly to NULL conversion?
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org