svn commit: r225894 - in head/sys: kern sys

Konstantin Belousov kib at FreeBSD.org
Sat Oct 1 10:18:55 UTC 2011


Author: kib
Date: Sat Oct  1 10:18:55 2011
New Revision: 225894
URL: http://svn.freebsd.org/changeset/base/225894

Log:
  The sigwait(3) function shall not return EINTR, according to the
  POSIX/SUSvN. The sigwait(2) syscall does return EINTR, and libc.so.7
  contains the wrapper sigwait(3) which hides EINTR from callers.  The
  EINTR return is used by libthr to handle required cancellation point
  in the sigwait(3).
  
  To help the binaries linked against pre-libc.so.7, i.e. RELENG_6 and
  earlier, to have right ABI for sigwait(3), transform EINTR return from
  sigwait(2) into ERESTART.
  
  Discussed with:	davidxu
  MFC after:	1 week

Modified:
  head/sys/kern/kern_sig.c
  head/sys/sys/param.h

Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c	Sat Oct  1 09:16:07 2011	(r225893)
+++ head/sys/kern/kern_sig.c	Sat Oct  1 10:18:55 2011	(r225894)
@@ -1094,6 +1094,8 @@ sys_sigwait(struct thread *td, struct si
 
 	error = kern_sigtimedwait(td, set, &ksi, NULL);
 	if (error) {
+		if (error == EINTR && td->td_proc->p_osrel < P_OSREL_SIGWAIT)
+			error = ERESTART;
 		if (error == ERESTART)
 			return (error);
 		td->td_retval[0] = error;

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h	Sat Oct  1 09:16:07 2011	(r225893)
+++ head/sys/sys/param.h	Sat Oct  1 10:18:55 2011	(r225894)
@@ -61,6 +61,7 @@
 #define __FreeBSD_version 1000000	/* Master, propagated to newvers */
 
 #ifdef _KERNEL
+#define	P_OSREL_SIGWAIT		700000
 #define	P_OSREL_SIGSEGV		700004
 #define	P_OSREL_MAP_ANON	800104
 #endif


More information about the svn-src-all mailing list