Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Apr 2015 06:52:44 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r281454 - in stable/10: lib/libc/include lib/libc/sys lib/libthr/thread share/man/man3
Message-ID:  <201504120652.t3C6qiYV009568@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun Apr 12 06:52:43 2015
New Revision: 281454
URL: https://svnweb.freebsd.org/changeset/base/281454

Log:
  MFC r280818:
  Make kevent(2) a cancellation point.

Added:
  stable/10/lib/libc/sys/kevent.c
     - copied unchanged from r280818, head/lib/libc/sys/kevent.c
Modified:
  stable/10/lib/libc/include/libc_private.h
  stable/10/lib/libc/sys/Makefile.inc
  stable/10/lib/libc/sys/interposing_table.c
  stable/10/lib/libc/sys/kqueue.2
  stable/10/lib/libthr/thread/thr_syscalls.c
  stable/10/share/man/man3/pthread_testcancel.3
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libc/include/libc_private.h
==============================================================================
--- stable/10/lib/libc/include/libc_private.h	Sun Apr 12 06:45:40 2015	(r281453)
+++ stable/10/lib/libc/include/libc_private.h	Sun Apr 12 06:52:43 2015	(r281454)
@@ -221,6 +221,7 @@ enum {
 	INTERPOS__pthread_mutex_init_calloc_cb,
 	INTERPOS_spinlock,
 	INTERPOS_spinunlock,
+	INTERPOS_kevent,
 	INTERPOS_MAX
 };
 
@@ -293,6 +294,7 @@ void *	__sys_freebsd6_mmap(void *, __siz
 struct aiocb;
 struct fd_set;
 struct iovec;
+struct kevent;
 struct msghdr;
 struct pollfd;
 struct rusage;
@@ -315,6 +317,8 @@ int		__sys_fsync(int);
 __pid_t		__sys_fork(void);
 int		__sys_ftruncate(int, __off_t);
 int		__sys_gettimeofday(struct timeval *, struct timezone *);
+int		__sys_kevent(int, const struct kevent *, int, struct kevent *,
+		    int, const struct timespec *);
 __off_t		__sys_lseek(int, __off_t, int);
 void	       *__sys_mmap(void *, __size_t, int, int, int, __off_t);
 int		__sys_msync(void *, __size_t, int);

Modified: stable/10/lib/libc/sys/Makefile.inc
==============================================================================
--- stable/10/lib/libc/sys/Makefile.inc	Sun Apr 12 06:45:40 2015	(r281453)
+++ stable/10/lib/libc/sys/Makefile.inc	Sun Apr 12 06:52:43 2015	(r281454)
@@ -47,6 +47,7 @@ INTERPOSED = \
 	fcntl \
 	fsync \
 	fork \
+	kevent \
 	msync \
 	nanosleep \
 	open \

Modified: stable/10/lib/libc/sys/interposing_table.c
==============================================================================
--- stable/10/lib/libc/sys/interposing_table.c	Sun Apr 12 06:45:40 2015	(r281453)
+++ stable/10/lib/libc/sys/interposing_table.c	Sun Apr 12 06:52:43 2015	(r281454)
@@ -75,6 +75,7 @@ interpos_func_t __libc_interposing[INTER
 	SLOT(_pthread_mutex_init_calloc_cb, _pthread_mutex_init_calloc_cb_stub),
 	SLOT(spinlock, __libc_spinlock_stub),
 	SLOT(spinunlock, __libc_spinunlock_stub),
+	SLOT(kevent, __sys_kevent),
 };
 #undef SLOT
 

Copied: stable/10/lib/libc/sys/kevent.c (from r280818, head/lib/libc/sys/kevent.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/lib/libc/sys/kevent.c	Sun Apr 12 06:52:43 2015	(r281454, copy of r280818, head/lib/libc/sys/kevent.c)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2015 The FreeBSD Foundation.
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Konstantin Belousov
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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(s), this list of conditions and the following disclaimer as
+ *    the first lines of this file unmodified other than the possible
+ *    addition of one or more copyright notices.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice(s), 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 COPYRIGHT HOLDER(S) ``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 COPYRIGHT HOLDER(S) 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.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+#include "libc_private.h"
+
+__weak_reference(__sys_kevent, __kevent);
+
+#pragma weak kevent
+int
+kevent(int kq, const struct kevent *changelist, int nchanges,
+    struct kevent *eventlist, int nevents, const struct timespec *timeout)
+{
+
+	return (((int (*)(int, const struct kevent *, int,
+	    struct kevent *, int, const struct timespec *))
+	    __libc_interposing[INTERPOS_kevent])(kq, changelist, nchanges,
+	   eventlist, nevents, timeout));
+}

Modified: stable/10/lib/libc/sys/kqueue.2
==============================================================================
--- stable/10/lib/libc/sys/kqueue.2	Sun Apr 12 06:45:40 2015	(r281453)
+++ stable/10/lib/libc/sys/kqueue.2	Sun Apr 12 06:52:43 2015	(r281454)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 18, 2014
+.Dd March 29, 2015
 .Dt KQUEUE 2
 .Os
 .Sh NAME
@@ -41,7 +41,7 @@
 .Fn kqueue "void"
 .Ft int
 .Fn kevent "int kq" "const struct kevent *changelist" "int nchanges" "struct kevent *eventlist" "int nevents" "const struct timespec *timeout"
-.Fn EV_SET "&kev" ident filter flags fflags data udata
+.Fn EV_SET "kev" ident filter flags fflags data udata
 .Sh DESCRIPTION
 The
 .Fn kqueue
@@ -532,6 +532,16 @@ On return,
 .Va fflags
 contains the users defined flags in the lower 24 bits.
 .El
+.Sh CANCELLATION BEHAVIOUR
+If
+.Fa nevents
+is non-zero, i.e. the function is potentially blocking, the call
+is a cancellation point.
+Otherwise, i.e. if
+.Fa nevents
+is zero, the call is not cancellable.
+Cancellation can only occur before any changes are made to the kqueue,
+or when the call was blocked and no changes to the queue were requested.
 .Sh RETURN VALUES
 The
 .Fn kqueue
@@ -595,6 +605,8 @@ The specified descriptor is invalid.
 .It Bq Er EINTR
 A signal was delivered before the timeout expired and before any
 events were placed on the kqueue for return.
+.It Bq Er EINTR
+A cancellation request was delivered to the thread, but not yet handled.
 .It Bq Er EINVAL
 The specified time limit or filter is invalid.
 .It Bq Er ENOENT
@@ -609,6 +621,14 @@ sysctl.
 .It Bq Er ESRCH
 The specified process to attach to does not exist.
 .El
+.Pp
+When
+.Fn kevent
+call fails with
+.Er EINTR
+error, all changes in the
+.Fa changelist
+have been applied.
 .Sh SEE ALSO
 .Xr aio_error 2 ,
 .Xr aio_read 2 ,
@@ -618,6 +638,7 @@ The specified process to attach to does 
 .Xr select 2 ,
 .Xr sigaction 2 ,
 .Xr write 2 ,
+.Xr pthread_setcancelstate 3 ,
 .Xr signal 3
 .Sh HISTORY
 The

Modified: stable/10/lib/libthr/thread/thr_syscalls.c
==============================================================================
--- stable/10/lib/libthr/thread/thr_syscalls.c	Sun Apr 12 06:45:40 2015	(r281453)
+++ stable/10/lib/libthr/thread/thr_syscalls.c	Sun Apr 12 06:52:43 2015	(r281454)
@@ -341,6 +341,29 @@ __thr_pselect(int count, fd_set *rfds, f
 	return (ret);
 }
 
+static int
+__thr_kevent(int kq, const struct kevent *changelist, int nchanges,
+    struct kevent *eventlist, int nevents, const struct timespec *timeout)
+{
+	struct pthread *curthread;
+	int ret;
+
+	if (nevents == 0) {
+		/*
+		 * No blocking, do not make the call cancellable.
+		 */
+		return (__sys_kevent(kq, changelist, nchanges, eventlist,
+		    nevents, timeout));
+	}
+	curthread = _get_curthread();
+	_thr_cancel_enter(curthread);
+	ret = __sys_kevent(kq, changelist, nchanges, eventlist, nevents,
+	    timeout);
+	_thr_cancel_leave(curthread, ret == -1 && nchanges == 0);
+
+	return (ret);
+}
+
 /*
  * Cancellation behavior:
  *   Thread may be canceled at start, but if the system call got some data, 
@@ -599,6 +622,7 @@ __thr_interpose_libc(void)
 	SLOT(writev);
 	SLOT(spinlock);
 	SLOT(spinunlock);
+	SLOT(kevent);
 #undef SLOT
 	*(__libc_interposing_slot(
 	    INTERPOS__pthread_mutex_init_calloc_cb)) =

Modified: stable/10/share/man/man3/pthread_testcancel.3
==============================================================================
--- stable/10/share/man/man3/pthread_testcancel.3	Sun Apr 12 06:45:40 2015	(r281453)
+++ stable/10/share/man/man3/pthread_testcancel.3	Sun Apr 12 06:52:43 2015	(r281454)
@@ -1,5 +1,5 @@
 .\" $FreeBSD$
-.Dd June 11, 2013
+.Dd March 29, 2015
 .Dt PTHREAD_TESTCANCEL 3
 .Os
 .Sh NAME
@@ -107,6 +107,7 @@ functions:
 .Fn close ,
 .Fn creat ,
 .Fn fsync ,
+.Fn kevent ,
 .Fn mq_receive ,
 .Fn mq_send ,
 .Fn mq_timedreceive ,
@@ -147,12 +148,20 @@ functions:
 .Fn waitpid ,
 .Fn write ,
 .Fn writev .
+.Pp
 The
 .Fn fcntl
 function is a cancellation point if
 .Fa cmd
 is
 .Dv F_SETLKW .
+.Pp
+The
+.Fn kevent
+function is a cancellation point if it is potentially blocking,
+i.e. when the
+.Fa nevents
+argument  is non-zero.
 .Sh RETURN VALUES
 If successful, the
 .Fn pthread_setcancelstate



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504120652.t3C6qiYV009568>