From 0ee1464bd20df97b45e20d7da031a206853dabaf Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Wed, 22 Oct 2025 18:48:33 +0000 Subject: Add libplaynice with keventbridge.h --- src/libplaynice/keventbridge_end.c | 21 ++++++++++ src/libplaynice/keventbridge_read.c | 16 ++++++++ src/libplaynice/keventbridge_start.c | 75 ++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 src/libplaynice/keventbridge_end.c create mode 100644 src/libplaynice/keventbridge_read.c create mode 100644 src/libplaynice/keventbridge_start.c (limited to 'src/libplaynice') diff --git a/src/libplaynice/keventbridge_end.c b/src/libplaynice/keventbridge_end.c new file mode 100644 index 0000000..57aef56 --- /dev/null +++ b/src/libplaynice/keventbridge_end.c @@ -0,0 +1,21 @@ +/* ISC license. */ + +#include + +#ifdef SKALIBS_HASKEVENT + +#include + +#include +#include + +void keventbridge_end (keventbridge *kbp) +{ + pthread_cancel(kbp->th) ; + pthread_join(kbp->th, 0) ; + fd_close(kbp->kq) ; + if (kbp->p[1] >= 0) fd_close(kbp->p[1]) ; + fd_close(kbp->p[0]) ; +} + +#endif diff --git a/src/libplaynice/keventbridge_read.c b/src/libplaynice/keventbridge_read.c new file mode 100644 index 0000000..e5a5eac --- /dev/null +++ b/src/libplaynice/keventbridge_read.c @@ -0,0 +1,16 @@ +/* ISC license. */ + +#include + +#ifdef SKALIBS_HASKEVENT + +#include +#include + +int keventbridge_read (keventbridge *kbp, struct kevent *ke) +{ + ssize_t r = sanitize_read(allread(kbp->p[0], (char *)ke, sizeof(struct kevent))) ; + return r <= 0 ? r : 1 ; +} + +#endif diff --git a/src/libplaynice/keventbridge_start.c b/src/libplaynice/keventbridge_start.c new file mode 100644 index 0000000..21ead0e --- /dev/null +++ b/src/libplaynice/keventbridge_start.c @@ -0,0 +1,75 @@ +/* ISC license. */ + +#include + +#ifdef SKALIBS_HASKEVENT + +#include +#include + +#include +#include +#include + +#ifdef SKALIBS_HASKQUEUE1 + +# define kqueuec() kqueue1(O_CLOEXEC) + +#else + +static int kqueuec (void) +{ + int kq = kqueue() ; + if (kq == -1) return -1 ; + if (coe(kq) == -1) + { + fd_close(kq) ; + return -1 ; + } + return kq ; +} + +#endif + +static void *keventbridge_reader (void *arg) +{ + keventbridge *kbp = arg ; + struct kevent ke ; + for (;;) + { + int r = kevent(kbp->kq, 0, 0, &ke, 1, 0) ; + if (r == -1 && errno != EINTR) break ; + if (r && allwrite(kbp->p[1], (char *)&ke, sizeof(ke)) < sizeof(ke)) break ; + } + fd_close(kbp->p[1]) ; + kbp->p[1] = -1 ; + return 0 ; +} + +int keventbridge_start (keventbridge *kbp) +{ + pthread_attr_t attr ; + int e ; + + kbp->kq = kqueuec() ; + if (pipecoe(kbp->p) == -1) goto errkq ; + if (ndelay_on(kbp->p[0]) == -1) goto errp ; + e = pthread_attr_init(&attr) ; + if (e) { errno = e ; goto errp ; } + pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) ; + e = pthread_create(&kbp->th, &attr, &keventbridge_reader, kbp) ; + if (e) { errno = e ; goto errattr ; } + pthread_attr_destroy(&attr) ; + return 1 ; + + errattr: + pthread_attr_destroy(&attr) ; + errp: + fd_close(kbp->p[1]) ; + fd_close(kbp->p[0]) ; + errkq: + fd_close(kbp->kq) ; + return 0 ; +} + +#endif -- cgit v1.3.1