aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xconfigure1
-rw-r--r--package/deps.mak6
-rw-r--r--src/include/skalibs/keventbridge.h30
-rw-r--r--src/include/skalibs/playnice.h8
-rw-r--r--src/include/skalibs/skalibs.h1
-rw-r--r--src/include/skalibs/stddjb.h4
-rw-r--r--src/libplaynice/keventbridge_end.c21
-rw-r--r--src/libplaynice/keventbridge_read.c16
-rw-r--r--src/libplaynice/keventbridge_start.c75
-rw-r--r--src/sysdeps/trykqueue1.c15
10 files changed, 174 insertions, 3 deletions
diff --git a/configure b/configure
index f873524..2f03c56 100755
--- a/configure
+++ b/configure
@@ -721,6 +721,7 @@ choose c pidfd_open 'pidfd_open()'
choose cl prctl 'prctl()'
choose cl procctl 'procctl()'
choose cl kevent 'kevent()'
+choose cl kqueue1 'kqueue1()'
# Here are the evil irreducible run-time sysdeps.
choose clr devurandom '/dev/urandom'
diff --git a/package/deps.mak b/package/deps.mak
index 95cf7c4..e6f0d0d 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -35,6 +35,7 @@ src/include/skalibs/keventbridge.h: src/include/skalibs/sysdeps.h
src/include/skalibs/kolbak.h: src/include/skalibs/unixmessage.h
src/include/skalibs/lolstdio.h: src/include/skalibs/bufalloc.h src/include/skalibs/buffer.h src/include/skalibs/strerr.h
src/include/skalibs/netstring.h: src/include/skalibs/buffer.h src/include/skalibs/stralloc.h
+src/include/skalibs/playnice.h: src/include/skalibs/keventbridge.h
src/include/skalibs/posixishard.h: src/include/skalibs/gccattributes.h src/include/skalibs/stat.h
src/include/skalibs/posixplz.h: src/include/skalibs/functypes.h src/include/skalibs/gccattributes.h
src/include/skalibs/prog.h: src/include/skalibs/types.h
@@ -44,7 +45,7 @@ src/include/skalibs/sha512.h: src/include/skalibs/uint64.h
src/include/skalibs/sig.h: src/include/skalibs/gccattributes.h
src/include/skalibs/siovec.h: src/include/skalibs/gccattributes.h
src/include/skalibs/skaclient.h: src/include/skalibs/kolbak.h src/include/skalibs/tai.h src/include/skalibs/unixmessage.h
-src/include/skalibs/skalibs.h: src/include/skalibs/cplz.h src/include/skalibs/datastruct.h src/include/skalibs/posixplz.h src/include/skalibs/random.h src/include/skalibs/stdcrypto.h src/include/skalibs/stddjb.h src/include/skalibs/strerr.h src/include/skalibs/unixonacid.h
+src/include/skalibs/skalibs.h: src/include/skalibs/cplz.h src/include/skalibs/datastruct.h src/include/skalibs/playnice.h src/include/skalibs/posixplz.h src/include/skalibs/random.h src/include/skalibs/stdcrypto.h src/include/skalibs/stddjb.h src/include/skalibs/strerr.h src/include/skalibs/unixonacid.h
src/include/skalibs/skamisc.h: src/include/skalibs/buffer.h src/include/skalibs/stralloc.h
src/include/skalibs/socket.h: src/include/skalibs/fcntl.h src/include/skalibs/gccattributes.h src/include/skalibs/posixplz.h src/include/skalibs/tai.h
src/include/skalibs/stat.h: src/include/skalibs/sysdeps.h
@@ -176,6 +177,9 @@ src/libenvexec/xmexec_afn.o src/libenvexec/xmexec_afn.lo: src/libenvexec/xmexec_
src/libenvexec/xmspawn_af.o src/libenvexec/xmspawn_af.lo: src/libenvexec/xmspawn_af.c src/include/skalibs/cspawn.h src/include/skalibs/strerr.h
src/libenvexec/xmspawn_afm.o src/libenvexec/xmspawn_afm.lo: src/libenvexec/xmspawn_afm.c src/include/skalibs/cspawn.h src/include/skalibs/strerr.h
src/libenvexec/xmspawn_afn.o src/libenvexec/xmspawn_afn.lo: src/libenvexec/xmspawn_afn.c src/include/skalibs/cspawn.h src/include/skalibs/strerr.h
+src/libplaynice/keventbridge_end.o src/libplaynice/keventbridge_end.lo: src/libplaynice/keventbridge_end.c src/include/skalibs/djbunix.h src/include/skalibs/keventbridge.h src/include/skalibs/sysdeps.h
+src/libplaynice/keventbridge_read.o src/libplaynice/keventbridge_read.lo: src/libplaynice/keventbridge_read.c src/include/skalibs/allreadwrite.h src/include/skalibs/keventbridge.h src/include/skalibs/sysdeps.h
+src/libplaynice/keventbridge_start.o src/libplaynice/keventbridge_start.lo: src/libplaynice/keventbridge_start.c src/include/skalibs/djbunix.h src/include/skalibs/fcntl.h src/include/skalibs/keventbridge.h src/include/skalibs/sysdeps.h
src/libposixplz/bsearchr.o src/libposixplz/bsearchr.lo: src/libposixplz/bsearchr.c src/include/skalibs/functypes.h src/include/skalibs/posixplz.h
src/libposixplz/doublefork.o src/libposixplz/doublefork.lo: src/libposixplz/doublefork.c src/include/skalibs/allreadwrite.h src/include/skalibs/djbunix.h src/include/skalibs/posixplz.h src/include/skalibs/uint64.h
src/libposixplz/execvep.o src/libposixplz/execvep.lo: src/libposixplz/execvep.c src/libposixplz/posixplz-internal.h src/include/skalibs/posixplz.h
diff --git a/src/include/skalibs/keventbridge.h b/src/include/skalibs/keventbridge.h
new file mode 100644
index 0000000..8389db0
--- /dev/null
+++ b/src/include/skalibs/keventbridge.h
@@ -0,0 +1,30 @@
+/* ISC license. */
+
+#ifndef SKALIBS_KEVENTBRIDGE_H
+#define SKALIBS_KEVENTBRIDGE_H
+
+#include <skalibs/sysdeps.h>
+
+#ifdef SKALIBS_HASKEVENT
+
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+#include <pthread.h>
+
+typedef struct keventbridge_s keventbridge, *keventbridge_ref ;
+struct keventbridge_s
+{
+ pthread_t th ;
+ int kq ;
+ int p[2] ;
+} ;
+#define KEVENTBRIDGE_ZERO { .th = PTHREAD_NULL, .kq = -1, .p = { -1, -1 } }
+
+extern int keventbridge_start (keventbridge *) ;
+#define keventbridge_write (kb, ke, n) kevent((kb)->kq, ke, (n), 0, 0, 0)
+extern int keventbridge_read (keventbridge const *, struct kevent *) ;
+extern void keventbridge_end (keventbridge *) ;
+
+#endif
+#endif
diff --git a/src/include/skalibs/playnice.h b/src/include/skalibs/playnice.h
new file mode 100644
index 0000000..e820d65
--- /dev/null
+++ b/src/include/skalibs/playnice.h
@@ -0,0 +1,8 @@
+/* ISC license. */
+
+#ifndef SKALIBS_PLAYNICE_H
+#define SKALIBS_PLAYNICE_H
+
+#include <skalibs/keventbridge.h>
+
+#endif
diff --git a/src/include/skalibs/skalibs.h b/src/include/skalibs/skalibs.h
index 2c55ef2..71ce9a2 100644
--- a/src/include/skalibs/skalibs.h
+++ b/src/include/skalibs/skalibs.h
@@ -21,5 +21,6 @@
#include <skalibs/random.h>
#include <skalibs/datastruct.h>
#include <skalibs/unixonacid.h>
+#include <skalibs/playnice.h>
#endif
diff --git a/src/include/skalibs/stddjb.h b/src/include/skalibs/stddjb.h
index d57a3df..edb5d58 100644
--- a/src/include/skalibs/stddjb.h
+++ b/src/include/skalibs/stddjb.h
@@ -1,7 +1,7 @@
/* ISC license. */
-#ifndef STDDJB_H
-#define STDDJB_H
+#ifndef SKALIBS_STDDJB_H
+#define SKALIBS_STDDJB_H
#include <skalibs/uint16.h>
#include <skalibs/uint32.h>
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 <skalibs/sysdeps.h>
+
+#ifdef SKALIBS_HASKEVENT
+
+#include <pthread.h>
+
+#include <skalibs/djbunix.h>
+#include <skalibs/keventbridge.h>
+
+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 <skalibs/sysdeps.h>
+
+#ifdef SKALIBS_HASKEVENT
+
+#include <skalibs/allreadwrite.h>
+#include <skalibs/keventbridge.h>
+
+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 <skalibs/sysdeps.h>
+
+#ifdef SKALIBS_HASKEVENT
+
+#include <errno.h>
+#include <pthread.h>
+
+#include <skalibs/fcntl.h>
+#include <skalibs/djbunix.h>
+#include <skalibs/keventbridge.h>
+
+#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
diff --git a/src/sysdeps/trykqueue1.c b/src/sysdeps/trykqueue1.c
new file mode 100644
index 0000000..95f1d29
--- /dev/null
+++ b/src/sysdeps/trykqueue1.c
@@ -0,0 +1,15 @@
+/* ISC license. */
+
+#undef _POSIX_C_SOURCE
+#undef _XOPEN_SOURCE
+
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+#include <fcntl.h>
+
+int main (void)
+{
+ int q = kqueue1(O_CLOEXEC) ;
+ return 0 ;
+}