test program:
import std.stdio;
import core.sys.freebsd.config;
import core.sys.freebsd.sys.event;
void main(string[] args) {
writefln("FreeBSD_version = %s", __FreeBSD_version);
writefln("sizeof(kevent_t) = %s", kevent_t.sizeof);
}
output:
@bsd:~/d> ./freebsdver
FreeBSD_version = 1104000
sizeof(kevent_t) = 32
actual version
@bsd:~/d> uname -K
1300139
NOTE:
/usr/include/d/dmd/core/sys/freebsd/sys/event.h do contain correct definition of kevent_t for versions 12+ (with ulong[4] ext field), but because of wrong kernel version size of kevent_t is also incorrect.
Comment #1 by dee0xeed — 2021-12-21T18:28:53Z
@bsd:~/d> dmd --version
DMD64 D Compiler v2.098.0
LDC2 standart library does not have core.sys.freebsd.config module,
but kevent_t.sizeof is also wrong:
bsd:~/d> ldc2 -v
binary /usr/local/bin/ldc2
version 1.23.0 (DMD v2.093.1, LLVM 10.0.1)
@bsd:~/d> ldc2 freebsdver.d
@bsd:~/d> ./freebsdver
sizeof(kevent_t) = 32
Must be 64, see exerpt from /usr/include/sys/event.h:
new, 12+:
struct kevent {
__uintptr_t ident; // identifier for this event
short filter; // filter for event
unsigned short flags; // action flags for kqueue
unsigned int fflags; // filter flag value
__int64_t data; // filter data value
void *udata; // opaque user data identifier
__uint64_t ext[4]; // extensions
};
old, 11-:
#if defined(_WANT_FREEBSD11_KEVENT)
// Older structure used in FreeBSD 11.x and older.
struct kevent_freebsd11 {
__uintptr_t ident; // identifier for this event
short filter; // filter for event
unsigned short flags;
unsigned int fflags;
__intptr_t data;
void *udata; // opaque user data identifier
};
#endif
Comment #2 by dee0xeed — 2021-12-21T18:43:56Z
LDC2 stdlib module (/usr/local/include/d/core/sys/freebsd/sys/event.d)
does not contain struct kevent_t for versions 12+ at all, so, "no problem" :)
Comment #3 by robert.schadek — 2024-12-01T16:39:44Z