On 6/3/20 5:22 AM, Daniel P. Berrangé wrote:

Forcing 8-byte alignment on virObjectEventPtr removes the
alignment increase during casts to subclasses.

Signed-off-by: Daniel P. BerrangĂ© <[email protected]>
---

Technically a build-breaker, but since we don't have any existing
usage of __attribute__((aligned)), I wanted to get a second opinion
on this approach.

One alternative approach would be to switch one of the current "int"
fields in virObjectEvent to "long long".


-struct _virObjectEvent {
+struct  __attribute__((aligned(4))) _virObjectEvent {
      virObject parent;
      int eventID;
      virObjectMeta meta;

As in this, although it makes the struct larger on 32-bit platforms (which may in turn affect cache usage):

struct _virObjectEvent {
    virObject parent;
    long long eventID;
...

Another possibility: use the extension of unnamed unions (but if we're going to rely on gcc extensions, __attribute__ is nicer than unnamed unions):

struct _virObjectEvent {
    union {
        virObject parent;
        long long alignment_;
    };
    int eventID;
...

We already limit ourselves to gcc and clang because of __attribute__((cleanup)), so I don't see any problem with your approach.

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

Reply via email to