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
--- 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 */
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[email protected]"

Reply via email to