[PATCH] Improve LinuxThreads compatibility in rfork()

Robert Millan rmh at debian.org
Mon Jul 11 10:54:07 UTC 2011


This patch made by Petr Salinger improves compatibility with
LinuxThreads in rfork() syscall.  The Linux clone() implementation
allows specifying the signal sent to parent when child terminates
(instead of SIGCHLD).

As the threading implementation in Debian GNU/kFreeBSD is
LinuxThreads-based, we had to diverge from upstream kFreeBSD ABI and
implement this extension.

I hope it is acceptable for you to use the same encoding, this way we
would archieve ABI compatibility to run Debian GNU/kFreeBSD inside a
chroot/jail on top of a FreeBSD system.

Thanks for considering

-- 
Robert Millan
-------------- next part --------------
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -477,7 +477,13 @@
 		p2->p_sigacts = newsigacts;
 	}
 	if (flags & RFLINUXTHPN) 
-	        p2->p_sigparent = SIGUSR1;
+	{
+		int sig;
+		sig = RFTHPNSIGNUM(flags);
+	        if (sig == 0) sig = SIGUSR1;
+	        if (sig == SIGCHLD) sig = 0;
+	        p2->p_sigparent = sig;
+	}
 	else
 	        p2->p_sigparent = SIGCHLD;
 
--- a/sys/sys/unistd.h
+++ b/sys/sys/unistd.h
@@ -182,6 +182,10 @@
 #define	RFHIGHPID	(1<<18)	/* use a pid higher than 10 (idleproc) */
 #define	RFPPWAIT	(1<<31)	/* parent sleeps until child exits (vfork) */
 #define	RFKERNELONLY	(RFSTOPPED | RFHIGHPID | RFPPWAIT)
+#define RFTHPNSHIFT	24	/* reserve bits 24-30 */
+#define RFTHPNMASK	0x7F    /* for compatibility with linuxthreads/clone()   */
+				/* allow to specify  "clone exit parent notification" signal */
+#define RFTHPNSIGNUM(flags)	(((flags) >> RFTHPNSHIFT) & RFTHPNMASK)
 
 #endif /* __BSD_VISIBLE */
 


More information about the freebsd-hackers mailing list