Author: kib
Date: Sat Dec 19 11:47:00 2009
New Revision: 200725
URL: http://svn.freebsd.org/changeset/base/200725

Log:
  MFC r198508, r198509:
  Reimplement pselect() in kernel, making change of sigmask and sleep atomic.
  
  MFC r198538:
  Move pselect(3) man page to section 2.

Added:
  stable/8/lib/libc/sys/pselect.2
     - copied unchanged from r198538, head/lib/libc/sys/pselect.2
Deleted:
  stable/8/lib/libc/gen/pselect.3
  stable/8/lib/libc/gen/pselect.c
Modified:
  stable/8/lib/libc/gen/Makefile.inc
  stable/8/lib/libc/gen/Symbol.map
  stable/8/lib/libc/sys/Makefile.inc
  stable/8/lib/libc/sys/Symbol.map
  stable/8/lib/libthr/thread/thr_syscalls.c
  stable/8/sys/compat/freebsd32/freebsd32_misc.c
  stable/8/sys/compat/freebsd32/syscalls.master
  stable/8/sys/kern/subr_trap.c
  stable/8/sys/kern/sys_generic.c
  stable/8/sys/kern/syscalls.master
  stable/8/sys/sys/syscallsubr.h
Directory Properties:
  stable/8/lib/libc/   (props changed)
  stable/8/lib/libc/stdtime/   (props changed)
  stable/8/lib/libthr/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/lib/libc/gen/Makefile.inc
==============================================================================
--- stable/8/lib/libc/gen/Makefile.inc  Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/lib/libc/gen/Makefile.inc  Sat Dec 19 11:47:00 2009        
(r200725)
@@ -22,7 +22,7 @@ SRCS+=  __getosreldate.c __xuname.c \
        initgroups.c isatty.c isinf.c isnan.c jrand48.c lcong48.c \
        lockf.c lrand48.c mrand48.c nftw.c nice.c \
        nlist.c nrand48.c opendir.c \
-       pause.c pmadvise.c popen.c posix_spawn.c pselect.c \
+       pause.c pmadvise.c popen.c posix_spawn.c \
        psignal.c pw_scan.c pwcache.c \
        raise.c readdir.c readpassphrase.c rewinddir.c \
        scandir.c seed48.c seekdir.c sem.c semctl.c \
@@ -63,7 +63,7 @@ MAN+= alarm.3 arc4random.3 \
        posix_spawnattr_getpgroup.3 posix_spawnattr_getschedparam.3 \
        posix_spawnattr_getschedpolicy.3 posix_spawnattr_init.3 \
        posix_spawnattr_getsigdefault.3 posix_spawnattr_getsigmask.3 \
-       pselect.3 psignal.3 pwcache.3 \
+       psignal.3 pwcache.3 \
        raise.3 rand48.3 readpassphrase.3 rfork_thread.3 \
        scandir.3 sem_destroy.3 sem_getvalue.3 sem_init.3 \
        sem_open.3 sem_post.3 sem_timedwait.3 sem_wait.3 \

Modified: stable/8/lib/libc/gen/Symbol.map
==============================================================================
--- stable/8/lib/libc/gen/Symbol.map    Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/lib/libc/gen/Symbol.map    Sat Dec 19 11:47:00 2009        
(r200725)
@@ -223,7 +223,6 @@ FBSD_1.0 {
        posix_madvise;
        popen;
        pclose;
-       pselect;
        psignal;
        raise;
        readdir;
@@ -453,7 +452,6 @@ FBSDprivate_1.0 {
        __opendir2;
        __pause;
        _pause;
-       __pselect;
        __pw_scan;      /* Used by (at least) libutil */
        __raise;
        _raise;

Modified: stable/8/lib/libc/sys/Makefile.inc
==============================================================================
--- stable/8/lib/libc/sys/Makefile.inc  Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/lib/libc/sys/Makefile.inc  Sat Dec 19 11:47:00 2009        
(r200725)
@@ -83,7 +83,8 @@ MAN+= abort2.2 accept.2 access.2 acct.2 
        mq_setattr.2 \
        msgctl.2 msgget.2 msgrcv.2 msgsnd.2 \
        msync.2 munmap.2 nanosleep.2 nfssvc.2 ntp_adjtime.2 open.2 \
-       pathconf.2 pipe.2 poll.2 posix_openpt.2 profil.2 ptrace.2 quotactl.2 \
+       pathconf.2 pipe.2 poll.2 posix_openpt.2 profil.2 \
+       pselect.2 ptrace.2 quotactl.2 \
        read.2 readlink.2 reboot.2 recv.2 rename.2 revoke.2 rfork.2 rmdir.2 \
        rtprio.2
 .if !defined(NO_P1003_1B)

Modified: stable/8/lib/libc/sys/Symbol.map
==============================================================================
--- stable/8/lib/libc/sys/Symbol.map    Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/lib/libc/sys/Symbol.map    Sat Dec 19 11:47:00 2009        
(r200725)
@@ -211,6 +211,7 @@ FBSD_1.0 {
        posix_openpt;
        preadv;
        profil;
+       pselect;
        ptrace;
        pwritev;
        quotactl;
@@ -779,6 +780,8 @@ FBSDprivate_1.0 {
        __sys_preadv;
        _profil;
        __sys_profil;
+       _pselect;
+       __sys_pselect;
        _ptrace;
        __sys_ptrace;
        _pwritev;

Copied: stable/8/lib/libc/sys/pselect.2 (from r198538, 
head/lib/libc/sys/pselect.2)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/8/lib/libc/sys/pselect.2     Sat Dec 19 11:47:00 2009        
(r200725, copy of r198538, head/lib/libc/sys/pselect.2)
@@ -0,0 +1,122 @@
+.\"
+.\" 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.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 27, 2009
+.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 HISTORY
+The
+.Fn pselect
+function first appeared in
+.Fx 5.0 .
+.Sh AUTHORS
+The first implementation of
+.Fn pselect
+function and this manual page were written by
+.An Garrett Wollman Aq [email protected] .

Modified: stable/8/lib/libthr/thread/thr_syscalls.c
==============================================================================
--- stable/8/lib/libthr/thread/thr_syscalls.c   Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/lib/libthr/thread/thr_syscalls.c   Sat Dec 19 11:47:00 2009        
(r200725)
@@ -104,6 +104,8 @@ extern int  __sys_accept(int, struct sock
 extern int     __sys_connect(int, const struct sockaddr *, socklen_t);
 extern int     __sys_fsync(int);
 extern int     __sys_msync(void *, size_t, int);
+extern int     __sys_pselect(int, fd_set *, fd_set *, fd_set *,
+                       const struct timespec *, const sigset_t *);
 extern int     __sys_poll(struct pollfd *, unsigned, int);
 extern ssize_t __sys_recv(int, void *, size_t, int);
 extern ssize_t __sys_recvfrom(int, void *, size_t, int, struct sockaddr *, 
socklen_t *);
@@ -366,7 +368,7 @@ ___pselect(int count, fd_set *rfds, fd_s
        int ret;
 
        _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);
 
        return (ret);

Modified: stable/8/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- stable/8/sys/compat/freebsd32/freebsd32_misc.c      Sat Dec 19 11:43:39 
2009        (r200724)
+++ stable/8/sys/compat/freebsd32/freebsd32_misc.c      Sat Dec 19 11:47:00 
2009        (r200725)
@@ -593,6 +593,41 @@ freebsd32_select(struct thread *td, stru
            sizeof(int32_t) * 8));
 }
 
+int
+freebsd32_pselect(struct thread *td, struct freebsd32_pselect_args *uap)
+{
+       struct timespec32 ts32;
+       struct timespec ts;
+       struct timeval tv, *tvp;
+       sigset_t set, *uset;
+       int error;
+
+       if (uap->ts != NULL) {
+               error = copyin(uap->ts, &ts32, sizeof(ts32));
+               if (error != 0)
+                       return (error);
+               CP(ts32, ts, tv_sec);
+               CP(ts32, ts, tv_nsec);
+               TIMESPEC_TO_TIMEVAL(&tv, &ts);
+               tvp = &tv;
+       } else
+               tvp = NULL;
+       if (uap->sm != NULL) {
+               error = copyin(uap->sm, &set, sizeof(set));
+               if (error != 0)
+                       return (error);
+               uset = &set;
+       } else
+               uset = NULL;
+       /*
+        * XXX big-endian needs to convert the fd_sets too.
+        * XXX Do pointers need PTRIN()?
+        */
+       error = kern_pselect(td, uap->nd, uap->in, uap->ou, uap->ex, tvp,
+           uset, sizeof(int32_t) * 8);
+       return (error);
+}
+
 /*
  * Copy 'count' items into the destination list pointed to by uap->eventlist.
  */

Modified: stable/8/sys/compat/freebsd32/syscalls.master
==============================================================================
--- stable/8/sys/compat/freebsd32/syscalls.master       Sat Dec 19 11:43:39 
2009        (r200724)
+++ stable/8/sys/compat/freebsd32/syscalls.master       Sat Dec 19 11:47:00 
2009        (r200725)
@@ -913,3 +913,7 @@
 519    AUE_PDKILL      UNIMPL  pdkill
 520    AUE_PDGETPID    UNIMPL  pdgetpid
 521    AUE_PDWAIT      UNIMPL  pdwait
+522    AUE_SELECT      STD     { int freebsd32_pselect(int nd, fd_set *in, \
+                                   fd_set *ou, fd_set *ex, \
+                                   const struct timespec32 *ts, \
+                                   const sigset_t *sm); }

Modified: stable/8/sys/kern/subr_trap.c
==============================================================================
--- stable/8/sys/kern/subr_trap.c       Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/sys/kern/subr_trap.c       Sat Dec 19 11:47:00 2009        
(r200725)
@@ -245,6 +245,11 @@ ast(struct trapframe *framep)
                PROC_UNLOCK(p);
        }
 
+       if (td->td_pflags & TDP_OLDMASK) {
+               td->td_pflags &= ~TDP_OLDMASK;
+               kern_sigprocmask(td, SIG_SETMASK, &td->td_oldsigmask, NULL, 0);
+       }
+
        userret(td, framep);
        mtx_assert(&Giant, MA_NOTOWNED);
 }

Modified: stable/8/sys/kern/sys_generic.c
==============================================================================
--- stable/8/sys/kern/sys_generic.c     Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/sys/kern/sys_generic.c     Sat Dec 19 11:47:00 2009        
(r200725)
@@ -751,6 +751,58 @@ poll_no_poll(int events)
        return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
 }
 
+int
+pselect(struct thread *td, struct pselect_args *uap)
+{
+       struct timespec ts;
+       struct timeval tv, *tvp;
+       sigset_t set, *uset;
+       int error;
+
+       if (uap->ts != NULL) {
+               error = copyin(uap->ts, &ts, sizeof(ts));
+               if (error != 0)
+                   return (error);
+               TIMESPEC_TO_TIMEVAL(&tv, &ts);
+               tvp = &tv;
+       } else
+               tvp = NULL;
+       if (uap->sm != NULL) {
+               error = copyin(uap->sm, &set, sizeof(set));
+               if (error != 0)
+                       return (error);
+               uset = &set;
+       } else
+               uset = NULL;
+       return (kern_pselect(td, uap->nd, uap->in, uap->ou, uap->ex, tvp,
+           uset, NFDBITS));
+}
+
+int
+kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou, fd_set *ex,
+    struct timeval *tvp, sigset_t *uset, int abi_nfdbits)
+{
+       int error;
+
+       if (uset != NULL) {
+               error = kern_sigprocmask(td, SIG_SETMASK, uset,
+                   &td->td_oldsigmask, 0);
+               if (error != 0)
+                       return (error);
+               td->td_pflags |= TDP_OLDMASK;
+               /*
+                * Make sure that ast() is called on return to
+                * usermode and TDP_OLDMASK is cleared, restoring old
+                * sigmask.
+                */
+               thread_lock(td);
+               td->td_flags |= TDF_ASTPENDING;
+               thread_unlock(td);
+       }
+       error = kern_select(td, nd, in, ou, ex, tvp, abi_nfdbits);
+       return (error);
+}
+
 #ifndef _SYS_SYSPROTO_H_
 struct select_args {
        int     nd;
@@ -759,9 +811,7 @@ struct select_args {
 };
 #endif
 int
-select(td, uap)
-       register struct thread *td;
-       register struct select_args *uap;
+select(struct thread *td, struct select_args *uap)
 {
        struct timeval tv, *tvp;
        int error;

Modified: stable/8/sys/kern/syscalls.master
==============================================================================
--- stable/8/sys/kern/syscalls.master   Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/sys/kern/syscalls.master   Sat Dec 19 11:47:00 2009        
(r200725)
@@ -919,5 +919,9 @@
 519    AUE_PDKILL      UNIMPL  pdkill
 520    AUE_PDGETPID    UNIMPL  pdgetpid
 521    AUE_PDWAIT      UNIMPL  pdwait
+522    AUE_SELECT      STD     { int pselect(int nd, fd_set *in, \
+                                   fd_set *ou, fd_set *ex, \
+                                   const struct timespec *ts, \
+                                   const sigset_t *sm); }
 ; Please copy any additions and changes to the following compatability tables:
 ; sys/compat/freebsd32/syscalls.master

Modified: stable/8/sys/sys/syscallsubr.h
==============================================================================
--- stable/8/sys/sys/syscallsubr.h      Sat Dec 19 11:43:39 2009        
(r200724)
+++ stable/8/sys/sys/syscallsubr.h      Sat Dec 19 11:47:00 2009        
(r200725)
@@ -148,6 +148,8 @@ int kern_pathconf(struct thread *td, cha
            int name, u_long flags);
 int    kern_pipe(struct thread *td, int fildes[2]);
 int    kern_preadv(struct thread *td, int fd, struct uio *auio, off_t offset);
+int    kern_pselect(struct thread *td, int nd, fd_set *in, fd_set *ou,
+           fd_set *ex, struct timeval *tvp, sigset_t *uset, int abi_nfdbits);
 int    kern_ptrace(struct thread *td, int req, pid_t pid, void *addr,
            int data);
 int    kern_pwritev(struct thread *td, int fd, struct uio *auio, off_t offset);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to