diff options
-rw-r--r-- | lib/libc_r/sys/Makefile.inc | 10 | ||||
-rw-r--r-- | lib/libc_r/uthread/Makefile.inc | 3 | ||||
-rw-r--r-- | lib/libc_r/uthread/pthread_private.h | 10 | ||||
-rw-r--r-- | lib/libc_r/uthread/uthread_kevent.c | 77 | ||||
-rw-r--r-- | lib/libpthread/sys/Makefile.inc | 10 | ||||
-rw-r--r-- | lib/libpthread/uthread/Makefile.inc | 3 | ||||
-rw-r--r-- | lib/libpthread/uthread/pthread_private.h | 10 | ||||
-rw-r--r-- | lib/libpthread/uthread/uthread_kevent.c | 77 |
8 files changed, 184 insertions, 16 deletions
diff --git a/lib/libc_r/sys/Makefile.inc b/lib/libc_r/sys/Makefile.inc index 85598b38d38..1348feea96f 100644 --- a/lib/libc_r/sys/Makefile.inc +++ b/lib/libc_r/sys/Makefile.inc @@ -1,5 +1,5 @@ -# $Id: Makefile.inc,v 1.6 2000/10/04 05:55:35 d Exp $ -# $OpenBSD: Makefile.inc,v 1.6 2000/10/04 05:55:35 d Exp $ +# $Id: Makefile.inc,v 1.7 2001/08/15 23:50:34 fgsch Exp $ +# $OpenBSD: Makefile.inc,v 1.7 2001/08/15 23:50:34 fgsch Exp $ .PATH: ${LIBC_RSRCDIR}/sys ${LIBC_RSRCDIR}/arch/${MACHINE_ARCH} @@ -23,9 +23,9 @@ SRCS+= uthread_machdep.c HIDDEN_SYSCALLS= accept.o bind.o close.o connect.o dup.o dup2.o \ execve.o fchflags.o fchmod.o fchown.o fcntl.o \ flock.o fpathconf.o fstat.o fstatfs.o fsync.o getdirentries.o \ - getlogin.o getpeername.o getsockname.o getsockopt.o ioctl.o listen.o \ - msync.o nanosleep.o open.o pipe.o poll.o read.o readv.o recvfrom.o \ - recvmsg.o sched_yield.o select.o sendmsg.o sendto.o \ + getlogin.o getpeername.o getsockname.o getsockopt.o ioctl.o kevent.o \ + listen.o msync.o nanosleep.o open.o pipe.o poll.o read.o readv.o \ + recvfrom.o recvmsg.o sched_yield.o select.o sendmsg.o sendto.o \ setsockopt.o shutdown.o sigaction.o sigaltstack.o \ sigprocmask.o sigsuspend.o \ socket.o socketpair.o wait4.o write.o writev.o \ diff --git a/lib/libc_r/uthread/Makefile.inc b/lib/libc_r/uthread/Makefile.inc index 37dbff5e5a8..110ec8e65e0 100644 --- a/lib/libc_r/uthread/Makefile.inc +++ b/lib/libc_r/uthread/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.10 2000/01/06 07:12:08 d Exp $ +# $OpenBSD: Makefile.inc,v 1.11 2001/08/15 23:50:34 fgsch Exp $ # $FreeBSD: Makefile.inc,v 1.19 1999/08/28 00:03:19 peter Exp $ # uthread sources @@ -66,6 +66,7 @@ SRCS+= \ uthread_ioctl.c \ uthread_join.c \ uthread_kern.c \ + uthread_kevent.c \ uthread_kill.c \ uthread_listen.c \ uthread_mattr_init.c \ diff --git a/lib/libc_r/uthread/pthread_private.h b/lib/libc_r/uthread/pthread_private.h index 79417040938..cff1cba3e90 100644 --- a/lib/libc_r/uthread/pthread_private.h +++ b/lib/libc_r/uthread/pthread_private.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pthread_private.h,v 1.21 2000/12/06 17:18:47 deraadt Exp $ */ +/* $OpenBSD: pthread_private.h,v 1.22 2001/08/15 23:50:34 fgsch Exp $ */ /* * Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>. * All rights reserved. @@ -832,7 +832,7 @@ void _thread_kern_sched(struct sigcontext *); void _thread_kern_sched_state(enum pthread_state,const char *fname,int lineno); void _thread_kern_sched_state_unlock(enum pthread_state state, spinlock_t *lock, char *fname, int lineno); -void _thread_kern_set_timeout(struct timespec *); +void _thread_kern_set_timeout(const struct timespec *); void _thread_kern_sig_defer(void); void _thread_kern_sig_undefer(void); void _thread_sig_handler(int, int, struct sigcontext *); @@ -1036,6 +1036,12 @@ pid_t _thread_sys_wait4(pid_t, int *, int, struct rusage *); int _thread_sys_poll(struct pollfd *, unsigned, int); #endif +/* #include <sys/event.h> */ +#ifdef _SYS_EVENT_H_ +int _thread_sys_kevent(int, const struct kevent *, int, struct kevent *, + int, const struct timespec *); +#endif + /* #include <sys/mman.h> */ int _thread_sys_msync(void *, size_t, int); diff --git a/lib/libc_r/uthread/uthread_kevent.c b/lib/libc_r/uthread/uthread_kevent.c new file mode 100644 index 00000000000..0985d05d38a --- /dev/null +++ b/lib/libc_r/uthread/uthread_kevent.c @@ -0,0 +1,77 @@ +/* $OpenBSD: uthread_kevent.c,v 1.1 2001/08/15 23:50:34 fgsch Exp $ */ +/*- + * Copyright (c) 2000 Jonathan Lemon <jlemon@flugsvamp.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: uthread_kevent.c,v 1.5 2001/04/10 04:19:20 deischen Exp $ + */ + +#include <unistd.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/time.h> +#include <sys/event.h> +#ifdef _THREAD_SAFE +#include <pthread.h> +#include "pthread_private.h" + +int +kevent(int kq, const struct kevent *changelist, int nchanges, + struct kevent *eventlist, int nevents, const struct timespec *timeout) +{ + struct timespec nullts = { 0, 0 }; + int rc; + + /* Set the wake up time */ + _thread_kern_set_timeout(timeout); + + rc = _thread_sys_kevent(kq, changelist, nchanges, + eventlist, nevents, &nullts); + if (rc == 0 && (timeout == NULL || + timeout->tv_sec != 0 || timeout->tv_nsec != 0)) { + /* Save the socket file descriptor: */ + _thread_run->data.fd.fd = kq; + _thread_run->data.fd.fname = __FILE__; + _thread_run->data.fd.branch = __LINE__; + + do { + /* Reset the interrupted and timeout flags: */ + _thread_run->interrupted = 0; + _thread_run->timeout = 0; + + _thread_kern_sched_state(PS_FDR_WAIT, + __FILE__, __LINE__); + + if (_thread_run->interrupted) { + errno = EINTR; + rc = -1; + break; + } + rc = _thread_sys_kevent(kq, NULL, 0, + eventlist, nevents, &nullts); + } while (rc == 0 && _thread_run->timeout == 0); + } + return (rc); +} +#endif diff --git a/lib/libpthread/sys/Makefile.inc b/lib/libpthread/sys/Makefile.inc index 85598b38d38..1348feea96f 100644 --- a/lib/libpthread/sys/Makefile.inc +++ b/lib/libpthread/sys/Makefile.inc @@ -1,5 +1,5 @@ -# $Id: Makefile.inc,v 1.6 2000/10/04 05:55:35 d Exp $ -# $OpenBSD: Makefile.inc,v 1.6 2000/10/04 05:55:35 d Exp $ +# $Id: Makefile.inc,v 1.7 2001/08/15 23:50:34 fgsch Exp $ +# $OpenBSD: Makefile.inc,v 1.7 2001/08/15 23:50:34 fgsch Exp $ .PATH: ${LIBC_RSRCDIR}/sys ${LIBC_RSRCDIR}/arch/${MACHINE_ARCH} @@ -23,9 +23,9 @@ SRCS+= uthread_machdep.c HIDDEN_SYSCALLS= accept.o bind.o close.o connect.o dup.o dup2.o \ execve.o fchflags.o fchmod.o fchown.o fcntl.o \ flock.o fpathconf.o fstat.o fstatfs.o fsync.o getdirentries.o \ - getlogin.o getpeername.o getsockname.o getsockopt.o ioctl.o listen.o \ - msync.o nanosleep.o open.o pipe.o poll.o read.o readv.o recvfrom.o \ - recvmsg.o sched_yield.o select.o sendmsg.o sendto.o \ + getlogin.o getpeername.o getsockname.o getsockopt.o ioctl.o kevent.o \ + listen.o msync.o nanosleep.o open.o pipe.o poll.o read.o readv.o \ + recvfrom.o recvmsg.o sched_yield.o select.o sendmsg.o sendto.o \ setsockopt.o shutdown.o sigaction.o sigaltstack.o \ sigprocmask.o sigsuspend.o \ socket.o socketpair.o wait4.o write.o writev.o \ diff --git a/lib/libpthread/uthread/Makefile.inc b/lib/libpthread/uthread/Makefile.inc index 37dbff5e5a8..110ec8e65e0 100644 --- a/lib/libpthread/uthread/Makefile.inc +++ b/lib/libpthread/uthread/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.10 2000/01/06 07:12:08 d Exp $ +# $OpenBSD: Makefile.inc,v 1.11 2001/08/15 23:50:34 fgsch Exp $ # $FreeBSD: Makefile.inc,v 1.19 1999/08/28 00:03:19 peter Exp $ # uthread sources @@ -66,6 +66,7 @@ SRCS+= \ uthread_ioctl.c \ uthread_join.c \ uthread_kern.c \ + uthread_kevent.c \ uthread_kill.c \ uthread_listen.c \ uthread_mattr_init.c \ diff --git a/lib/libpthread/uthread/pthread_private.h b/lib/libpthread/uthread/pthread_private.h index 79417040938..cff1cba3e90 100644 --- a/lib/libpthread/uthread/pthread_private.h +++ b/lib/libpthread/uthread/pthread_private.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pthread_private.h,v 1.21 2000/12/06 17:18:47 deraadt Exp $ */ +/* $OpenBSD: pthread_private.h,v 1.22 2001/08/15 23:50:34 fgsch Exp $ */ /* * Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>. * All rights reserved. @@ -832,7 +832,7 @@ void _thread_kern_sched(struct sigcontext *); void _thread_kern_sched_state(enum pthread_state,const char *fname,int lineno); void _thread_kern_sched_state_unlock(enum pthread_state state, spinlock_t *lock, char *fname, int lineno); -void _thread_kern_set_timeout(struct timespec *); +void _thread_kern_set_timeout(const struct timespec *); void _thread_kern_sig_defer(void); void _thread_kern_sig_undefer(void); void _thread_sig_handler(int, int, struct sigcontext *); @@ -1036,6 +1036,12 @@ pid_t _thread_sys_wait4(pid_t, int *, int, struct rusage *); int _thread_sys_poll(struct pollfd *, unsigned, int); #endif +/* #include <sys/event.h> */ +#ifdef _SYS_EVENT_H_ +int _thread_sys_kevent(int, const struct kevent *, int, struct kevent *, + int, const struct timespec *); +#endif + /* #include <sys/mman.h> */ int _thread_sys_msync(void *, size_t, int); diff --git a/lib/libpthread/uthread/uthread_kevent.c b/lib/libpthread/uthread/uthread_kevent.c new file mode 100644 index 00000000000..0985d05d38a --- /dev/null +++ b/lib/libpthread/uthread/uthread_kevent.c @@ -0,0 +1,77 @@ +/* $OpenBSD: uthread_kevent.c,v 1.1 2001/08/15 23:50:34 fgsch Exp $ */ +/*- + * Copyright (c) 2000 Jonathan Lemon <jlemon@flugsvamp.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: uthread_kevent.c,v 1.5 2001/04/10 04:19:20 deischen Exp $ + */ + +#include <unistd.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/time.h> +#include <sys/event.h> +#ifdef _THREAD_SAFE +#include <pthread.h> +#include "pthread_private.h" + +int +kevent(int kq, const struct kevent *changelist, int nchanges, + struct kevent *eventlist, int nevents, const struct timespec *timeout) +{ + struct timespec nullts = { 0, 0 }; + int rc; + + /* Set the wake up time */ + _thread_kern_set_timeout(timeout); + + rc = _thread_sys_kevent(kq, changelist, nchanges, + eventlist, nevents, &nullts); + if (rc == 0 && (timeout == NULL || + timeout->tv_sec != 0 || timeout->tv_nsec != 0)) { + /* Save the socket file descriptor: */ + _thread_run->data.fd.fd = kq; + _thread_run->data.fd.fname = __FILE__; + _thread_run->data.fd.branch = __LINE__; + + do { + /* Reset the interrupted and timeout flags: */ + _thread_run->interrupted = 0; + _thread_run->timeout = 0; + + _thread_kern_sched_state(PS_FDR_WAIT, + __FILE__, __LINE__); + + if (_thread_run->interrupted) { + errno = EINTR; + rc = -1; + break; + } + rc = _thread_sys_kevent(kq, NULL, 0, + eventlist, nevents, &nullts); + } while (rc == 0 && _thread_run->timeout == 0); + } + return (rc); +} +#endif |