[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