Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Jul 2011 13:35:26 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Petr Salinger <Petr.Salinger@seznam.cz>
Cc:        freebsd-hackers@freebsd.org, Robert Millan <rmh@debian.org>, current@freebsd.org
Subject:   Re: [PATCH] Improve LinuxThreads compatibility in rfork()
Message-ID:  <20110712103526.GF43872@deviant.kiev.zoral.com.ua>
In-Reply-To: <alpine.LRH.2.02.1107121108300.10573@sci.felk.cvut.cz>
References:  <20110711142232.GU43872@deviant.kiev.zoral.com.ua> <alpine.LRH.2.02.1107111641340.7134@sci.felk.cvut.cz> <20110711150614.GV43872@deviant.kiev.zoral.com.ua> <alpine.LRH.2.02.1107111718440.7134@sci.felk.cvut.cz> <20110711154102.GW43872@deviant.kiev.zoral.com.ua> <alpine.LRH.2.02.1107111805350.7134@sci.felk.cvut.cz> <20110711172408.GX43872@deviant.kiev.zoral.com.ua> <alpine.LRH.2.02.1107111944550.7134@sci.felk.cvut.cz> <20110711180246.GA43872@deviant.kiev.zoral.com.ua> <alpine.LRH.2.02.1107121108300.10573@sci.felk.cvut.cz>

next in thread | previous in thread | raw e-mail | index | archive | help

--qJM7dOmrnYWq+SaN
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Jul 12, 2011 at 11:16:28AM +0200, Petr Salinger wrote:
> >>Seems this interface be acceptable ?
> >
> >Looks good to me.
>=20
> The proposed code changes are in the attached patch.
>=20
> Proposed wording of addition into RFORK(2):

Below is the patch I intend to commit after you retest it.
I added the checks for validity of the flags, and some rewording to the
manual page.

diff --git a/lib/libc/sys/rfork.2 b/lib/libc/sys/rfork.2
index f1ae14b..993fd1b 100644
--- a/lib/libc/sys/rfork.2
+++ b/lib/libc/sys/rfork.2
@@ -5,7 +5,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 15, 2011
+.Dd July 12, 2011
 .Dt RFORK 2
 .Os
 .Sh NAME
@@ -84,6 +84,16 @@ Note that a lot of code will not run correctly in such a=
n environment.
 .It Dv RFSIGSHARE
 If set, the kernel will force sharing the sigacts structure between the
 child and the parent.
+.It Dv RFTSIGZMB
+If set, the kernel will deliver a specified signal to the parent
+upon the child exit, instead of default SIGCHILD.
+The signal number
+.Dv signum
+is specified by oring the
+.Dv RFTSIGFLAGS(signum)
+expression into
+.Fa flags .
+Specifying signal number 0 disables signal delivery upon the child exit.
 .It Dv RFLINUXTHPN
 If set, the kernel will return SIGUSR1 instead of SIGCHILD upon thread
 exit for the child.
@@ -164,6 +174,8 @@ would be exceeded (see
 Both the RFFDG and the RFCFDG flags were specified.
 .It Bq Er EINVAL
 Any flags not listed above were specified.
+.It Bq Er EINVAL
+An invalid signal number was specified.
 .It Bq Er ENOMEM
 There is insufficient swap space for the new process.
 .El
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index a8abd8e..9d3e22d 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -476,7 +476,10 @@ do_fork(struct thread *td, int flags, struct proc *p2,=
 struct thread *td2,
 		sigacts_copy(newsigacts, p1->p_sigacts);
 		p2->p_sigacts =3D newsigacts;
 	}
-	if (flags & RFLINUXTHPN)=20
+
+	if (flags & RFTSIGZMB)
+	        p2->p_sigparent =3D RFTSIGNUM(flags);
+	else if (flags & RFLINUXTHPN)
 	        p2->p_sigparent =3D SIGUSR1;
 	else
 	        p2->p_sigparent =3D SIGCHLD;
@@ -719,10 +722,22 @@ fork1(struct thread *td, int flags, int pages, struct=
 proc **procp)
 	static int curfail;
 	static struct timeval lastfail;
=20
+	/* Check for the undefined or unimplemented flags. */
+	if ((flags & ~(RFFLAGS | RFTSIGFLAGS(RFTSIGMASK))) !=3D 0)
+		return (EINVAL);
+
+	/* Signal value requires RFTSIGZMB. */
+	if ((flags & RFTSIGFLAGS(RFTSIGMASK)) !=3D 0 && (flags & RFTSIGZMB) =3D=
=3D 0)
+		return (EINVAL);
+
 	/* Can't copy and clear. */
 	if ((flags & (RFFDG|RFCFDG)) =3D=3D (RFFDG|RFCFDG))
 		return (EINVAL);
=20
+	/* Check the validity of the signal number. */
+	if ((flags & RFTSIGZMB) !=3D 0 && (u_int)RFTSIGNUM(flags) > _SIG_MAXSIG)
+		return (EINVAL);
+
 	p1 =3D td->td_proc;
=20
 	/*
diff --git a/sys/sys/unistd.h b/sys/sys/unistd.h
index 378308d..9d56a3a 100644
--- a/sys/sys/unistd.h
+++ b/sys/sys/unistd.h
@@ -180,8 +180,16 @@
 #define	RFLINUXTHPN	(1<<16)	/* do linux clone exit parent notification */
 #define	RFSTOPPED	(1<<17)	/* leave child in a stopped state */
 #define	RFHIGHPID	(1<<18)	/* use a pid higher than 10 (idleproc) */
+#define	RFTSIGZMB	(1<<19)	/* select signal for exit parent notification */
+#define	RFTSIGSHIFT	20	/* selected signal number is in bits 20-27  */
+#define	RFTSIGMASK	0xFF
+#define	RFTSIGNUM(flags)	(((flags) >> RFTSIGSHIFT) & RFTSIGMASK)
+#define	RFTSIGFLAGS(signum)	((signum) << RFTSIGSHIFT)
 #define	RFPPWAIT	(1<<31)	/* parent sleeps until child exits (vfork) */
 #define	RFKERNELONLY	(RFSTOPPED | RFHIGHPID | RFPPWAIT)
+#define	RFFLAGS		(RFFDG | RFPROC | RFMEM | RFNOWAIT | RFCFDG | \
+    RFTHREAD | RFSIGSHARE | RFLINUXTHPN | RFSTOPPED | RFHIGHPID | RFTSIGZM=
B | \
+    RFPPWAIT)
=20
 #endif /* __BSD_VISIBLE */
=20

--qJM7dOmrnYWq+SaN
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (FreeBSD)

iEYEARECAAYFAk4cI20ACgkQC3+MBN1Mb4hM7gCeIk2P6FoqM7j24okpKp/hpnj8
ryEAoM3cL/0UcCUBjoes4UUS/nU5P8ZC
=nlxa
-----END PGP SIGNATURE-----

--qJM7dOmrnYWq+SaN--



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