Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Aug 2010 09:57:06 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r211737 - in head/lib/libthr: . thread
Message-ID:  <201008240957.o7O9v6BE070046@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Tue Aug 24 09:57:06 2010
New Revision: 211737
URL: http://svn.freebsd.org/changeset/base/211737

Log:
  Add wrapper for setcontext() and swapcontext(), the wrappers
  unblock SIGCANCEL which is needed by thread cancellation.

Modified:
  head/lib/libthr/pthread.map
  head/lib/libthr/thread/thr_private.h
  head/lib/libthr/thread/thr_sig.c

Modified: head/lib/libthr/pthread.map
==============================================================================
--- head/lib/libthr/pthread.map	Tue Aug 24 08:11:11 2010	(r211736)
+++ head/lib/libthr/pthread.map	Tue Aug 24 09:57:06 2010	(r211737)
@@ -342,6 +342,7 @@ FBSDprivate_1.0 {
 	_pthread_timedjoin_np;
 	_pthread_yield;
 	_raise;
+	_setcontext;
 	_sigaction;
 	_sigprocmask;
 	_sigsuspend;
@@ -351,6 +352,7 @@ FBSDprivate_1.0 {
 	_spinlock;
 	_spinlock_debug;
 	_spinunlock;
+	_swapcontext;
 
 	/* Debugger needs these. */
 	_libthr_debug;
@@ -397,4 +399,6 @@ FBSD_1.1 {
 
 FBSD_1.2 {
 	openat;
+	setcontext;
+	swapcontext;
 };

Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h	Tue Aug 24 08:11:11 2010	(r211736)
+++ head/lib/libthr/thread/thr_private.h	Tue Aug 24 09:57:06 2010	(r211737)
@@ -709,6 +709,12 @@ int	__sys_sigwaitinfo(const sigset_t *se
 int	__sys_nanosleep(const struct timespec *, struct timespec *);
 #endif
 
+/* #include <sys/ucontext.h> */
+#ifdef _SYS_UCONTEXT_H_
+int	__sys_setcontext(const ucontext_t *ucp);
+int	__sys_swapcontext(ucontext_t *oucp, const ucontext_t *ucp);
+#endif
+
 /* #include <unistd.h> */
 #ifdef  _UNISTD_H_
 int     __sys_close(int);

Modified: head/lib/libthr/thread/thr_sig.c
==============================================================================
--- head/lib/libthr/thread/thr_sig.c	Tue Aug 24 08:11:11 2010	(r211736)
+++ head/lib/libthr/thread/thr_sig.c	Tue Aug 24 09:57:06 2010	(r211737)
@@ -59,7 +59,29 @@ int	_sigwaitinfo(const sigset_t *set, si
 int	__sigwait(const sigset_t *set, int *sig);
 int	_sigwait(const sigset_t *set, int *sig);
 int	__sigsuspend(const sigset_t *sigmask);
+int	_setcontext(const ucontext_t *);
+int	_swapcontext(ucontext_t *, const ucontext_t *);
 
+static void
+remove_thr_signals(sigset_t *set)
+{
+	if (SIGISMEMBER(*set, SIGCANCEL))
+		SIGDELSET(*set, SIGCANCEL);
+}
+
+static const sigset_t *
+thr_remove_thr_signals(const sigset_t *set, sigset_t *newset)
+{
+	const sigset_t *pset;
+
+	if (SIGISMEMBER(*set, SIGCANCEL)) {
+		*newset = *set;
+		SIGDELSET(*newset, SIGCANCEL);
+		pset = newset;
+	} else
+		pset = set;
+	return (pset);
+}
 
 static void
 sigcancel_handler(int sig __unused,
@@ -268,20 +290,6 @@ _pthread_sigmask(int how, const sigset_t
 
 __weak_reference(__sigsuspend, sigsuspend);
 
-static const sigset_t *
-thr_remove_thr_signals(const sigset_t *set, sigset_t *newset)
-{
-	const sigset_t *pset;
-
-	if (SIGISMEMBER(*set, SIGCANCEL)) {
-		*newset = *set;
-		SIGDELSET(*newset, SIGCANCEL);
-		pset = newset;
-	} else
-		pset = set;
-	return (pset);
-}
-
 int
 _sigsuspend(const sigset_t * set)
 {
@@ -389,3 +397,26 @@ __sigwait(const sigset_t *set, int *sig)
 	_thr_cancel_leave_defer(curthread, (ret != 0));
 	return (ret);
 }
+
+__weak_reference(_setcontext, setcontext);
+int
+_setcontext(const ucontext_t *ucp)
+{
+	ucontext_t uc;
+
+	(void) memcpy(&uc, ucp, sizeof (uc));
+	remove_thr_signals(&uc.uc_sigmask);
+
+	return __sys_setcontext(&uc);
+}
+
+__weak_reference(_swapcontext, swapcontext);
+int
+_swapcontext(ucontext_t *oucp, const ucontext_t *ucp)
+{
+	ucontext_t uc;
+
+	(void) memcpy(&uc, ucp, sizeof (uc));
+	remove_thr_signals(&uc.uc_sigmask);
+	return __sys_swapcontext(oucp, &uc);
+}



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