On Tuesday, 14 September 2021 at 15:37:27 UTC, eugene wrote:
On Tuesday, 14 September 2021 at 14:56:00 UTC, jfondren wrote:
You could fix this by having a 128-bit struct and passing C an index into it

It is another "not so funny joke", isn't it?

No. And when was the first one?

```d
align (1) struct EpollEvent {
    align(1):
    uint event_mask;
    EventSource es;
    /* just do not want to use that union, epoll_data_t */
}
static assert(EpollEvent.sizeof == 12);
```

That's 96 bits. Add 32.

```d
class EventSource { }
align(1) struct EpollEvent {
    align(1):
    uint event_mask;
    EventSource es;
}
struct OuterEpollEvent {
    int _dummy;
    uint event_mask;
    EventSource es;
}
EpollEvent* epollEvent(return ref OuterEpollEvent ev) @trusted {
    return cast(EpollEvent*) &ev.event_mask;
}
void dumpEpollEvent(EpollEvent* ev) @trusted {
    import std.stdio : writeln;

    writeln(*ev);
}

unittest {
    // can't be @safe:
// Error: field `EpollEvent.es` cannot modify misaligned pointers in `@safe` code
    EpollEvent ev;
    ev.es = new EventSource; // misaligned
}

@safe unittest { // this is fine
    OuterEpollEvent ev;
    ev.event_mask = 0;
    ev.es = new EventSource; // not misaligned
    ev.epollEvent.dumpEpollEvent;
}
```

Reply via email to