--- nono/lib/kevent.h 2026/04/29 17:05:08 1.1.1.2 +++ nono/lib/kevent.h 2026/04/29 17:05:56 1.1.1.4 @@ -25,12 +25,12 @@ using kevent_udata_t = decltype(kevent::udata); // udata と int の相互変換 -static inline kevent_udata_t +inline kevent_udata_t EV_INT2UDATA(int x) { return (kevent_udata_t)(intptr_t)x; } -static inline int +inline int EV_UDATA2INT(kevent_udata_t x) { return (int)(intptr_t)x; @@ -39,11 +39,20 @@ EV_UDATA2INT(kevent_udata_t x) #define kevent_set(k, e, n) kevent((k), (e), (n), NULL, 0, NULL) #define kevent_poll(k, e, n, t) kevent((k), NULL, 0, (e), (n), (t)) -static inline int +inline int kevent_add(int kq, int fd, int filter, int action, int udata) { struct kevent kev; + int r; EV_SET(&kev, fd, filter, action, 0, 0, EV_INT2UDATA(udata)); - return kevent_set(kq, &kev, 1); + r = kevent_set(kq, &kev, 1); +#if defined(__linux__) + // libkqueue は負数を返すけど errno == 0 ということがあり、 + // どういうことか分からないけど、とりあえず正常扱いしておく。 + if (r < 0 && errno == 0) { + r = 0; + } +#endif + return r; }