Implement an RFTSIGZMB flag to rfork(2) to specify a signal that is

delivered to parent when the child exists.

Submitted by:	Petr Salinger <Petr.Salinger seznam cz> (Debian/kFreeBSD)
MFC after:	1 week
X-MFC-note:	bump __FreeBSD_version
This commit is contained in:
Konstantin Belousov 2011-07-12 20:37:18 +00:00
parent 1a3b5ce2b9
commit f49d820256
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=223966
2 changed files with 24 additions and 1 deletions

View File

@ -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 = newsigacts;
}
if (flags & RFLINUXTHPN)
if (flags & RFTSIGZMB)
p2->p_sigparent = RFTSIGNUM(flags);
else if (flags & RFLINUXTHPN)
p2->p_sigparent = SIGUSR1;
else
p2->p_sigparent = SIGCHLD;
@ -719,10 +722,22 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
static int curfail;
static struct timeval lastfail;
/* Check for the undefined or unimplemented flags. */
if ((flags & ~(RFFLAGS | RFTSIGFLAGS(RFTSIGMASK))) != 0)
return (EINVAL);
/* Signal value requires RFTSIGZMB. */
if ((flags & RFTSIGFLAGS(RFTSIGMASK)) != 0 && (flags & RFTSIGZMB) == 0)
return (EINVAL);
/* Can't copy and clear. */
if ((flags & (RFFDG|RFCFDG)) == (RFFDG|RFCFDG))
return (EINVAL);
/* Check the validity of the signal number. */
if ((flags & RFTSIGZMB) != 0 && (u_int)RFTSIGNUM(flags) > _SIG_MAXSIG)
return (EINVAL);
p1 = td->td_proc;
/*

View File

@ -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 | RFTSIGZMB | \
RFPPWAIT)
#endif /* __BSD_VISIBLE */