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;
}
```