Add pselect syscall.
authorNicolas Thery <nth@dragonflybsd.org>
Thu, 10 Jan 2008 22:30:28 +0000 (22:30 +0000)
committerNicolas Thery <nth@dragonflybsd.org>
Thu, 10 Jan 2008 22:30:28 +0000 (22:30 +0000)
Add pselect man page (obtained from FreeBSD).

Add pselect wrapper in libthread_xu that calls pselect syscall.

Add pselect wrapper in libc_r that calls poll syscall (see XXX in code
and BUGS in pselect man page).

Changed libbind to use pselect syscall instead of locally defined wrapper.

18 files changed:
include/unistd.h
lib/libbind/port_after.h
lib/libc/sys/Makefile.inc
lib/libc/sys/pselect.2 [new file with mode: 0644]
lib/libc_r/uthread/uthread_select.c
lib/libthread_xu/thread/thr_syscalls.c
sys/kern/init_sysent.c
sys/kern/sys_generic.c
sys/kern/syscalls.c
sys/kern/syscalls.master
sys/platform/pc32/i386/trap.c
sys/platform/vkernel/i386/trap.c
sys/sys/select.h
sys/sys/syscall-hide.h
sys/sys/syscall.h
sys/sys/syscall.mk
sys/sys/sysproto.h
sys/sys/sysunion.h

index d238c2b..1de298c 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)unistd.h    8.12 (Berkeley) 4/27/95
  * $FreeBSD: src/include/unistd.h,v 1.35.2.10 2002/04/15 12:52:28 nectar Exp $
- * $DragonFly: src/include/unistd.h,v 1.21 2007/03/12 21:07:41 corecode Exp $
+ * $DragonFly: src/include/unistd.h,v 1.22 2008/01/10 22:30:27 nth Exp $
  */
 
 #ifndef _UNISTD_H_
@@ -195,6 +195,10 @@ void       *sbrk(intptr_t);
 struct timeval;                                /* select(2) */
 int     select(int, fd_set * __restrict, fd_set * __restrict,
                fd_set * __restrict, struct timeval * __restrict);
+struct timespec;                       /* pselect(2) */
+int     pselect(int, fd_set * __restrict, fd_set * __restrict,
+               fd_set * __restrict, const struct timespec * __restrict,
+               const sigset_t * __restrict);
 #endif
 int     setdomainname(const char *, int);
 int     setegid(gid_t);
index 7cce3b9..72fd0c8 100644 (file)
@@ -1,4 +1,4 @@
-/* $DragonFly: src/lib/libbind/port_after.h,v 1.2 2006/09/20 21:48:39 victor Exp $ */
+/* $DragonFly: src/lib/libbind/port_after.h,v 1.3 2008/01/10 22:30:27 nth Exp $ */
 #ifndef port_after_h
 #define port_after_h
 
@@ -13,7 +13,6 @@
 #include <inttypes.h>
 #endif
 
-#define NEED_PSELECT
 #define HAVE_SA_LEN 1
 #define HAVE_MINIMUM_IFREQ 1
 #undef NEED_DAEMON
index f943c0e..6634590 100644 (file)
@@ -1,6 +1,6 @@
 #      @(#)Makefile.inc        8.3 (Berkeley) 10/24/94
 # $FreeBSD: src/lib/libc/sys/Makefile.inc,v 1.75.2.7 2003/04/22 17:31:18 trhodes Exp $
-# $DragonFly: src/lib/libc/sys/Makefile.inc,v 1.29 2007/12/14 23:12:55 swildner Exp $
+# $DragonFly: src/lib/libc/sys/Makefile.inc,v 1.30 2008/01/10 22:30:27 nth Exp $
 
 # sys sources
 .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/sys ${.CURDIR}/../libc/sys
@@ -91,7 +91,9 @@ MAN+= _exit.2 accept.2 access.2 acct.2 adjtime.2 \
        sigstack.2 sigsuspend.2 socket.2 socketpair.2 stat.2 statfs.2 \
        swapon.2 symlink.2 sync.2 sysarch.2 syscall.2 syslink.2 \
        truncate.2 tls.2 umask.2 umtx.2 undelete.2 \
-       unlink.2 utimes.2 upc_register.2 usched_set.2 uuidgen.2 vfork.2 wait.2 write.2
+       unlink.2 utimes.2 upc_register.2 usched_set.2 uuidgen.2 vfork.2 \
+       wait.2 write.2 pselect.2
+
 .if !defined(NO_P1003_1B)
 MAN+=  sched_get_priority_max.2 sched_setparam.2 \
        sched_setscheduler.2 sched_yield.2
diff --git a/lib/libc/sys/pselect.2 b/lib/libc/sys/pselect.2
new file mode 100644 (file)
index 0000000..52c7c8d
--- /dev/null
@@ -0,0 +1,135 @@
+.\"
+.\" Copyright 2002 Massachusetts Institute of Technology
+.\"
+.\" Permission to use, copy, modify, and distribute this software and
+.\" its documentation for any purpose and without fee is hereby
+.\" granted, provided that both the above copyright notice and this
+.\" permission notice appear in all copies, that both the above
+.\" copyright notice and this permission notice appear in all
+.\" supporting documentation, and that the name of M.I.T. not be used
+.\" in advertising or publicity pertaining to distribution of the
+.\" software without specific, written prior permission.  M.I.T. makes
+.\" no representations about the suitability of this software for any
+.\" purpose.  It is provided "as is" without express or implied
+.\" warranty.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
+.\" ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
+.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
+.\" SHALL M.I.T. 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.
+.\"
+.\" $DragonFly: src/lib/libc/sys/pselect.2,v 1.1 2008/01/10 22:30:27 nth Exp $
+.\"
+.Dd December 24, 2007
+.Dt PSELECT 2
+.Os
+.Sh NAME
+.Nm pselect
+.Nd synchronous I/O multiplexing a la POSIX.1g
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In sys/select.h
+.Ft int
+.Fo pselect
+.Fa "int nfds"
+.Fa "fd_set * restrict readfds"
+.Fa "fd_set * restrict writefds"
+.Fa "fd_set * restrict exceptfds"
+.Fa "const struct timespec * restrict timeout"
+.Fa "const sigset_t * restrict newsigmask"
+.Fc
+.Sh DESCRIPTION
+The
+.Fn pselect
+function was introduced by
+.St -p1003.1g-2000
+as a slightly stronger version of
+.Xr select 2 .
+The
+.Fa nfds , readfds , writefds ,
+and
+.Fa exceptfds
+arguments are all identical to the analogous arguments of
+.Fn select .
+The
+.Fa timeout
+argument in
+.Fn pselect
+points to a
+.Vt "const struct timespec"
+rather than the (modifiable)
+.Vt "struct timeval"
+used by
+.Fn select ;
+as in
+.Fn select ,
+a null pointer may be passed to indicate that
+.Fn pselect
+should wait indefinitely.
+Finally,
+.Fa newsigmask
+specifies a signal mask which is set while waiting for input.
+When
+.Fn pselect
+returns, the original signal mask is restored.
+.Pp
+See
+.Xr select 2
+for a more detailed discussion of the semantics of this interface, and
+for macros used to manipulate the
+.Vt "fd_set"
+data type.
+.Sh RETURN VALUES
+The
+.Fn pselect
+function returns the same values and under the same conditions as
+.Fn select .
+.Sh ERRORS
+The
+.Fn pselect
+function may fail for any of the reasons documented for
+.Xr select 2
+and (if a signal mask is provided)
+.Xr sigprocmask 2 .
+.Sh SEE ALSO
+.Xr kqueue 2 ,
+.Xr poll 2 ,
+.Xr select 2 ,
+.Xr sigprocmask 2
+.Sh STANDARDS
+The
+.Fn pselect
+function conforms to
+.St -p1003.1-2001 .
+.Sh BUGS
+The
+.Fn pselect
+implementation in libc_r (user multi-threading) does not mask signals, calls
+.Fn select ,
+and restores the original signal mask atomically.  A calling user thread
+using
+.Fn pselect
+to block until either a signal occurs or some descriptor changes may therefore
+block forever.
+The
+.Fn pselect
+implementations in libthread_xu (kernel multi-threading) and libc
+(single-threading) operate atomically and are therefore race-free.
+.Sh HISTORY
+The
+.Fn pselect
+function first appeared in
+.Dx 1.11 .
+.Sh AUTHORS
+This manual page was originally written by
+.An Garrett Wollman Aq wollman@FreeBSD.org
+for FreeBSD and later modified for DragonFly.
index 56e0274..29286a9 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/lib/libc_r/uthread/uthread_select.c,v 1.16.2.5 2002/10/22 14:44:03 fjoe Exp $
- * $DragonFly: src/lib/libc_r/uthread/uthread_select.c,v 1.2 2003/06/17 04:26:48 dillon Exp $
+ * $DragonFly: src/lib/libc_r/uthread/uthread_select.c,v 1.3 2008/01/10 22:30:27 nth Exp $
  */
 #include <unistd.h>
 #include <errno.h>
@@ -228,3 +228,48 @@ select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
 
        return ret;
 }
+
+
+int
+pselect(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+       const struct timespec *timeout, const sigset_t *mask)
+{
+       sigset_t omask;
+       struct timeval tv;
+       struct timeval *tvp;
+       int ret;
+
+       _thread_enter_cancellation_point();
+
+       if (timeout != NULL) {
+               tv.tv_sec = timeout->tv_sec;
+               tv.tv_usec = (timeout->tv_nsec + 999) / 1000;
+               tvp = &tv;
+       } else {
+               tvp = NULL;
+       }
+
+       /*
+        * XXX The masking/select/unmasking sequence below is not atomic.  See
+        * man page.
+        *
+        * The Right Thing would be to mask/unmask signals kernel-side.  We do
+        * this for single-threaded and libthread_xu processes but this is far
+        * from trivial for libc_r because select() is actually a poll()
+        * wrapper there and not using poll() would involve complex changes in
+        * the user thread scheduler.  We're deprecating libc_r in favor of
+        * libthread_xu so the usefulness of such a change is questionable.
+        */
+
+       if (mask != NULL)
+               (void) sigprocmask(SIG_SETMASK, mask, &omask);
+
+       ret = _select(numfds, readfds, writefds, exceptfds, tvp);
+
+       if (mask != NULL)
+               (void) sigprocmask(SIG_SETMASK, &omask, NULL);
+
+       _thread_leave_cancellation_point();
+
+       return ret;
+}
index 0c2432a..fcb6906 100644 (file)
@@ -28,7 +28,7 @@
  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $DragonFly: src/lib/libthread_xu/thread/thr_syscalls.c,v 1.7 2006/04/06 13:03:09 davidxu Exp $
+ * $DragonFly: src/lib/libthread_xu/thread/thr_syscalls.c,v 1.8 2008/01/10 22:30:27 nth Exp $
  */
 
 /*
@@ -95,7 +95,7 @@
 
 extern int     __creat(const char *, mode_t);
 extern int     __pause(void);
-extern int     __pselect(int, fd_set *, fd_set *, fd_set *,
+extern int     __sys_pselect(int, fd_set *, fd_set *, fd_set *,
                        const struct timespec *, const sigset_t *);
 extern unsigned        __sleep(unsigned int);
 extern int     __system(const char *);
@@ -382,10 +382,9 @@ __poll(struct pollfd *fds, unsigned int nfds, int timeout)
 }
 
 __strong_reference(__poll, poll);
-#if 0
 
 int 
-_pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, 
+__pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
        const struct timespec *timo, const sigset_t *mask)
 {
        struct pthread *curthread = tls_get_curthread();
@@ -393,13 +392,12 @@ _pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
        int ret;
 
        oldcancel = _thr_cancel_enter(curthread);
-       ret = __pselect(count, rfds, wfds, efds, timo, mask);
+       ret = __sys_pselect(count, rfds, wfds, efds, timo, mask);
        _thr_cancel_leave(curthread, oldcancel);
 
        return (ret);
 }
-__strong_reference(_pselect, pselect);
-#endif
+__strong_reference(__pselect, pselect);
 
 
 int
index 8f59611..8ff3959 100644 (file)
@@ -2,8 +2,8 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/init_sysent.c,v 1.58 2007/06/16 20:00:37 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+ * $DragonFly: src/sys/kern/init_sysent.c,v 1.59 2008/01/10 22:30:27 nth Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
  */
 
 #include "opt_compat.h"
@@ -533,4 +533,5 @@ struct sysent sysent[] = {
        { 0, (sy_call_t *)sys_lwp_gettid },             /* 496 = lwp_gettid */
        { AS(lwp_kill_args), (sy_call_t *)sys_lwp_kill },       /* 497 = lwp_kill */
        { AS(lwp_rtprio_args), (sy_call_t *)sys_lwp_rtprio },   /* 498 = lwp_rtprio */
+       { AS(pselect_args), (sy_call_t *)sys_pselect }, /* 499 = pselect */
 };
index 9ee35cb..f466c2b 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)sys_generic.c       8.5 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/sys_generic.c,v 1.55.2.10 2001/03/17 10:39:32 peter Exp $
- * $DragonFly: src/sys/kern/sys_generic.c,v 1.46 2007/08/15 03:15:06 dillon Exp $
+ * $DragonFly: src/sys/kern/sys_generic.c,v 1.47 2008/01/10 22:30:27 nth Exp $
  */
 
 #include "opt_ktrace.h"
@@ -77,6 +77,8 @@ static MALLOC_DEFINE(M_IOCTLMAP, "ioctlmap", "mapped ioctl handler buffer");
 static MALLOC_DEFINE(M_SELECT, "select", "select() buffer");
 MALLOC_DEFINE(M_IOV, "iov", "large iov's");
 
+static int     doselect(int nd, fd_set *in, fd_set *ou, fd_set *ex,
+                       struct timeval *tv, int *res);
 static int     pollscan (struct proc *, struct pollfd *, u_int, int *);
 static int     selscan (struct proc *, fd_mask **, fd_mask **,
                        int, int *);
@@ -759,6 +761,118 @@ SYSCTL_INT(_kern, OID_AUTO, nselcoll, CTLFLAG_RD, &nselcoll, 0, "");
  */
 int
 sys_select(struct select_args *uap)
+{
+       struct timeval ktv;
+       struct timeval *ktvp;
+       int error;
+
+       /*
+        * Get timeout if any.
+        */
+       if (uap->tv != NULL) {
+               error = copyin(uap->tv, &ktv, sizeof (ktv));
+               if (error)
+                       return (error);
+               error = itimerfix(&ktv);
+               if (error)
+                       return (error);
+               ktvp = &ktv;
+       } else {
+               ktvp = NULL;
+       }
+
+       /*
+        * Do real work.
+        */
+       error = doselect(uap->nd, uap->in, uap->ou, uap->ex, ktvp,
+                       &uap->sysmsg_result);
+
+       return (error);
+}
+
+
+/*
+ * Pselect system call.
+ */
+int
+sys_pselect(struct pselect_args *uap)
+{
+       struct thread *td = curthread;
+       struct lwp *lp = td->td_lwp;
+       struct timespec kts;
+       struct timeval ktv;
+       struct timeval *ktvp;
+       sigset_t sigmask;
+       int error;
+
+       /*
+        * Get timeout if any and convert it.
+        * Round up during conversion to avoid timeout going off early.
+        */
+       if (uap->ts != NULL) {
+               error = copyin(uap->ts, &kts, sizeof (kts));
+               if (error)
+                       return (error);
+               ktv.tv_sec = kts.tv_sec;
+               ktv.tv_usec = (kts.tv_nsec + 999) / 1000;
+               error = itimerfix(&ktv);
+               if (error)
+                       return (error);
+               ktvp = &ktv;
+       } else {
+               ktvp = NULL;
+       }
+
+       /*
+        * Install temporary signal mask if any provided.
+        */
+       if (uap->sigmask != NULL) {
+               error = copyin(uap->sigmask, &sigmask, sizeof(sigmask));
+               if (error)
+                       return (error);
+               lp->lwp_oldsigmask = lp->lwp_sigmask;
+               SIG_CANTMASK(sigmask);
+               lp->lwp_sigmask = sigmask;
+       }
+
+       /*
+        * Do real job.
+        */
+       error = doselect(uap->nd, uap->in, uap->ou, uap->ex, ktvp,
+                       &uap->sysmsg_result);
+
+       if (uap->sigmask != NULL) {
+               /* doselect() responsible for turning ERESTART into EINTR */
+               KKASSERT(error != ERESTART);
+               if (error == EINTR) {
+                       /*
+                        * We can't restore the previous signal mask now
+                        * because it could block the signal that interrupted
+                        * us.  So make a note to restore it after executing
+                        * the handler.
+                        */
+                       lp->lwp_flag |= LWP_OLDMASK;
+               } else {
+                       /*
+                        * No handler to run. Restore previous mask immediately.
+                        */
+                       lp->lwp_sigmask = lp->lwp_oldsigmask;
+               }
+       }
+
+       return (error);
+}
+
+/*
+ * Common code for sys_select() and sys_pselect().
+ *
+ * in, out and ex are userland pointers.  tv must point to validated
+ * kernel-side timeout value or NULL for infinite timeout.  res must
+ * point to syscall return value.
+ */
+static int
+doselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv,
+               int *res)
 {
        struct lwp *lp = curthread->td_lwp;
        struct proc *p = curproc;
@@ -775,23 +889,23 @@ sys_select(struct select_args *uap)
        int ncoll, error, timo;
        u_int nbufbytes, ncpbytes, nfdbits;
 
-       if (uap->nd < 0)
+       if (nd < 0)
                return (EINVAL);
-       if (uap->nd > p->p_fd->fd_nfiles)
-               uap->nd = p->p_fd->fd_nfiles;   /* forgiving; slightly wrong */
+       if (nd > p->p_fd->fd_nfiles)
+               nd = p->p_fd->fd_nfiles;   /* forgiving; slightly wrong */
 
        /*
         * Allocate just enough bits for the non-null fd_sets.  Use the
         * preallocated auto buffer if possible.
         */
-       nfdbits = roundup(uap->nd, NFDBITS);
+       nfdbits = roundup(nd, NFDBITS);
        ncpbytes = nfdbits / NBBY;
        nbufbytes = 0;
-       if (uap->in != NULL)
+       if (in != NULL)
                nbufbytes += 2 * ncpbytes;
-       if (uap->ou != NULL)
+       if (ou != NULL)
                nbufbytes += 2 * ncpbytes;
-       if (uap->ex != NULL)
+       if (ex != NULL)
                nbufbytes += 2 * ncpbytes;
        if (nbufbytes <= sizeof s_selbits)
                selbits = &s_selbits[0];
@@ -806,13 +920,13 @@ sys_select(struct select_args *uap)
        sbp = selbits;
 #define        getbits(name, x) \
        do {                                                            \
-               if (uap->name == NULL)                                  \
+               if (name == NULL)                                       \
                        ibits[x] = NULL;                                \
                else {                                                  \
                        ibits[x] = sbp + nbufbytes / 2 / sizeof *sbp;   \
                        obits[x] = sbp;                                 \
                        sbp += ncpbytes / sizeof *sbp;                  \
-                       error = copyin(uap->name, ibits[x], ncpbytes);  \
+                       error = copyin(name, ibits[x], ncpbytes);       \
                        if (error != 0)                                 \
                                goto done;                              \
                }                                                       \
@@ -824,15 +938,8 @@ sys_select(struct select_args *uap)
        if (nbufbytes != 0)
                bzero(selbits, nbufbytes / 2);
 
-       if (uap->tv) {
-               error = copyin((caddr_t)uap->tv, (caddr_t)&atv,
-                       sizeof (atv));
-               if (error)
-                       goto done;
-               if (itimerfix(&atv)) {
-                       error = EINVAL;
-                       goto done;
-               }
+       if (tv != NULL) {
+               atv = *tv;
                getmicrouptime(&rtv);
                timevaladd(&atv, &rtv);
        } else {
@@ -843,12 +950,12 @@ sys_select(struct select_args *uap)
 retry:
        ncoll = nselcoll;
        lp->lwp_flag |= LWP_SELECT;
-       error = selscan(p, ibits, obits, uap->nd, &uap->sysmsg_result);
-       if (error || uap->sysmsg_result)
+       error = selscan(p, ibits, obits, nd, res);
+       if (error || *res)
                goto done;
        if (atv.tv_sec || atv.tv_usec) {
                getmicrouptime(&rtv);
-               if (timevalcmp(&rtv, &atv, >=)) 
+               if (timevalcmp(&rtv, &atv, >=))
                        goto done;
                ttv = atv;
                timevalsub(&ttv, &rtv);
@@ -875,7 +982,7 @@ done:
        if (error == EWOULDBLOCK)
                error = 0;
 #define        putbits(name, x) \
-       if (uap->name && (error2 = copyout(obits[x], uap->name, ncpbytes))) \
+       if (name && (error2 = copyout(obits[x], name, ncpbytes))) \
                error = error2;
        if (error == 0) {
                int error2;
index 535d7ba..8e4d4cb 100644 (file)
@@ -2,8 +2,8 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/kern/syscalls.c,v 1.57 2007/06/16 20:00:37 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+ * $DragonFly: src/sys/kern/syscalls.c,v 1.58 2008/01/10 22:30:27 nth Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
  */
 
 char *syscallnames[] = {
@@ -508,4 +508,5 @@ char *syscallnames[] = {
        "lwp_gettid",                   /* 496 = lwp_gettid */
        "lwp_kill",                     /* 497 = lwp_kill */
        "lwp_rtprio",                   /* 498 = lwp_rtprio */
+       "pselect",                      /* 499 = pselect */
 };
index fa2dc24..e8ace97 100644 (file)
@@ -1,4 +1,4 @@
- $DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp $
+ $DragonFly: src/sys/kern/syscalls.master,v 1.57 2008/01/10 22:30:27 nth Exp $
 
 ; @(#)syscalls.master  8.2 (Berkeley) 1/13/94
 ; $FreeBSD: src/sys/kern/syscalls.master,v 1.72.2.10 2002/07/12 08:22:46 alfred Exp $
 496    STD     BSD     { lwpid_t lwp_gettid(void); }
 497    STD     BSD     { int lwp_kill(pid_t pid, lwpid_t tid, int signum); }
 498    STD     BSD     { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); }
+499    STD     BSD     { int pselect(int nd, fd_set *in, fd_set *ou, \
+                           fd_set *ex, const struct timespec *ts,    \
+                           const sigset_t *sigmask); }
index 8420368..b6ff0e7 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)trap.c        7.4 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
- * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.108 2007/09/07 19:31:30 dillon Exp $
+ * $DragonFly: src/sys/platform/pc32/i386/trap.c,v 1.109 2008/01/10 22:30:27 nth Exp $
  */
 
 /*
@@ -302,6 +302,12 @@ recheck:
                rel_mplock();
                goto recheck;
        }
+
+       /*
+        * Make sure postsig() handled request to restore old signal mask after
+        * running signal handler.
+        */
+       KKASSERT((lp->lwp_flag & LWP_OLDMASK) == 0);
 }
 
 /*
index 56fe02a..2fba3d0 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     from: @(#)trap.c        7.4 (Berkeley) 5/13/91
  * $FreeBSD: src/sys/i386/i386/trap.c,v 1.147.2.11 2003/02/27 19:09:59 luoqi Exp $
- * $DragonFly: src/sys/platform/vkernel/i386/trap.c,v 1.28 2007/11/26 04:14:01 dillon Exp $
+ * $DragonFly: src/sys/platform/vkernel/i386/trap.c,v 1.29 2008/01/10 22:30:28 nth Exp $
  */
 
 /*
@@ -286,6 +286,12 @@ recheck:
                rel_mplock();
                goto recheck;
        }
+
+       /*
+        * Make sure postsig() handled request to restore old signal mask after
+        * running signal handler.
+        */
+       KKASSERT((lp->lwp_flag & LWP_OLDMASK) == 0);
 }
 
 /*
index d5fe206..b2e7ffa 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)select.h    8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/sys/select.h,v 1.6.2.1 2000/05/05 03:50:02 jlemon Exp $
- * $DragonFly: src/sys/sys/select.h,v 1.9 2006/06/18 01:00:35 corecode Exp $
+ * $DragonFly: src/sys/sys/select.h,v 1.10 2008/01/10 22:30:28 nth Exp $
  */
 
 #ifndef _SYS_SELECT_H_
@@ -85,6 +85,10 @@ __BEGIN_DECLS
 struct timeval;
 int    select(int, fd_set * __restrict, fd_set * __restrict,
               fd_set * __restrict, struct timeval * __restrict);
+struct timespec;
+int     pselect(int, fd_set * __restrict, fd_set * __restrict,
+               fd_set * __restrict, const struct timespec * __restrict,
+               const sigset_t * __restrict);
 #endif
 __END_DECLS
 
index b8e38e0..c25f0e5 100644 (file)
@@ -2,8 +2,8 @@
  * System call hiders.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall-hide.h,v 1.58 2007/06/16 20:00:36 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall-hide.h,v 1.59 2008/01/10 22:30:28 nth Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
  */
 
 #ifdef COMPAT_43
@@ -330,3 +330,4 @@ HIDE_BSD(lwp_create)
 HIDE_BSD(lwp_gettid)
 HIDE_BSD(lwp_kill)
 HIDE_BSD(lwp_rtprio)
+HIDE_BSD(pselect)
index 7981f3f..7cf96ad 100644 (file)
@@ -2,8 +2,8 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/syscall.h,v 1.58 2007/06/16 20:00:36 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+ * $DragonFly: src/sys/sys/syscall.h,v 1.59 2008/01/10 22:30:28 nth Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
  */
 
 #define        SYS_syscall     0
 #define        SYS_lwp_gettid  496
 #define        SYS_lwp_kill    497
 #define        SYS_lwp_rtprio  498
-#define        SYS_MAXSYSCALL  499
+#define        SYS_pselect     499
+#define        SYS_MAXSYSCALL  500
index 0b927be..58c33ad 100644 (file)
@@ -1,7 +1,7 @@
 # DragonFly system call names.
 # DO NOT EDIT-- this file is automatically generated.
-# $DragonFly: src/sys/sys/syscall.mk,v 1.58 2007/06/16 20:00:36 dillon Exp $
-# created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+# $DragonFly: src/sys/sys/syscall.mk,v 1.59 2008/01/10 22:30:28 nth Exp $
+# created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
 MIASM =  \
        syscall.o \
        exit.o \
@@ -281,4 +281,5 @@ MIASM =  \
        lwp_create.o \
        lwp_gettid.o \
        lwp_kill.o \
-       lwp_rtprio.o
+       lwp_rtprio.o \
+       pselect.o
index 7c1f511..ce8498b 100644 (file)
@@ -2,8 +2,8 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysproto.h,v 1.58 2007/06/16 20:00:36 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+ * $DragonFly: src/sys/sys/sysproto.h,v 1.59 2008/01/10 22:30:28 nth Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
  */
 
 #ifndef _SYS_SYSPROTO_H_
@@ -2111,6 +2111,17 @@ struct   lwp_rtprio_args {
        lwpid_t tid;    char tid_[PAD_(lwpid_t)];
        struct rtprio * rtp;    char rtp_[PAD_(struct rtprio *)];
 };
+struct pselect_args {
+#ifdef _KERNEL
+       struct sysmsg sysmsg;
+#endif
+       int     nd;     char nd_[PAD_(int)];
+       fd_set *        in;     char in_[PAD_(fd_set *)];
+       fd_set *        ou;     char ou_[PAD_(fd_set *)];
+       fd_set *        ex;     char ex_[PAD_(fd_set *)];
+       const struct timespec * ts;     char ts_[PAD_(const struct timespec *)];
+       const sigset_t *        sigmask;        char sigmask_[PAD_(const sigset_t *)];
+};
 
 #ifdef COMPAT_43
 
@@ -2691,6 +2702,7 @@ int       sys_lwp_create (struct lwp_create_args *);
 int    sys_lwp_gettid (struct lwp_gettid_args *);
 int    sys_lwp_kill (struct lwp_kill_args *);
 int    sys_lwp_rtprio (struct lwp_rtprio_args *);
+int    sys_pselect (struct pselect_args *);
 
 #endif /* !_SYS_SYSPROTO_H_ */
 #undef PAD_
index 020518d..c2bc81a 100644 (file)
@@ -2,8 +2,8 @@
  * Union of syscall args for messaging.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $DragonFly: src/sys/sys/sysunion.h,v 1.55 2007/06/16 20:00:36 dillon Exp $
- * created from DragonFly: src/sys/kern/syscalls.master,v 1.55 2007/05/03 23:04:31 dillon Exp 
+ * $DragonFly: src/sys/sys/sysunion.h,v 1.56 2008/01/10 22:30:28 nth Exp $
+ * created from DragonFly: src/sys/kern/syscalls.master,v 1.56 2007/06/16 20:00:37 dillon Exp 
  */
 
 union sysunion {
@@ -386,4 +386,5 @@ union sysunion {
        struct  lwp_gettid_args lwp_gettid;
        struct  lwp_kill_args lwp_kill;
        struct  lwp_rtprio_args lwp_rtprio;
+       struct  pselect_args pselect;
 };