svn commit: r200725 - in stable/8: lib/libc/gen lib/libc/sys
lib/libthr/thread sys/compat/freebsd32 sys/kern sys/sys
Konstantin Belousov
kib at FreeBSD.org
Sat Dec 19 11:47:01 UTC 2009
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 wollman at FreeBSD.org .
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);
More information about the svn-src-stable-8
mailing list