* dcrt0.cc (do_exit): Don't bother looking for pgrp children to send SIGHUP if

process has never created any children.
* fork.cc (fork): Set flag indicating that there is another process with our
process group.
* spawn.cc (spawn_guts): Ditto.
* pinfo.h (set_has_pgid_children): New methods for setting when process has
children in its process group.
* syscalls.cc (setpgid): Clear has_gid_children if pgid changes.
This commit is contained in:
Christopher Faylor 2000-10-25 03:54:50 +00:00
parent 8c8d0db462
commit f8f9b12e6c
6 changed files with 28 additions and 3 deletions

View File

@ -1,3 +1,14 @@
Tue Oct 24 23:45:09 2000 Christopher Faylor <cgf@cygnus.com>
* dcrt0.cc (do_exit): Don't bother looking for pgrp children to send
SIGHUP if process has never created any children.
* fork.cc (fork): Set flag indicating that there is another process
with our process group.
* spawn.cc (spawn_guts): Ditto.
* pinfo.h (set_has_pgid_children): New methods for setting when process
has children in its process group.
* syscalls.cc (setpgid): Clear has_gid_children if pgid changes.
Tue Oct 24 20:38:00 2000 Corinna Vinschen <corinna@vinschen.de> Tue Oct 24 20:38:00 2000 Corinna Vinschen <corinna@vinschen.de>
* ntdll.h: New file. * ntdll.h: New file.

View File

@ -1024,7 +1024,7 @@ do_exit (int status)
set_console_title (old_title); set_console_title (old_title);
/* Kill orphaned children on group leader exit */ /* Kill orphaned children on group leader exit */
if (myself->pid == myself->pgid) if (myself->has_pgid_children && myself->pid == myself->pgid)
{ {
system_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children", system_printf ("%d == pgrp %d, send SIG{HUP,CONT} to stopped children",
myself->pid, myself->pgid); myself->pid, myself->pgid);
@ -1041,7 +1041,7 @@ do_exit (int status)
myself->pid, myself->sid); myself->pid, myself->sid);
if (tp->getsid () == myself->sid) if (tp->getsid () == myself->sid)
kill (-tp->getpgid (), SIGHUP); kill_pgrp (tp->getpgid (), SIGHUP);
} }
tty_terminate (); tty_terminate ();

View File

@ -598,6 +598,8 @@ fork ()
void *esp; void *esp;
__asm ("movl %%esp,%0": "=r" (esp)); __asm ("movl %%esp,%0": "=r" (esp));
myself->set_has_pgid_children ();
child_info_fork ch; child_info_fork ch;
int res = setjmp (ch.jmp); int res = setjmp (ch.jmp);

View File

@ -70,6 +70,7 @@ public:
pid_t sid; /* Session ID */ pid_t sid; /* Session ID */
int ctty; /* Control tty */ int ctty; /* Control tty */
mode_t umask; mode_t umask;
bool has_pgid_children;/* True if we've forked or spawned children with our GID. */
char username[MAX_USER_NAME]; /* user's name */ char username[MAX_USER_NAME]; /* user's name */
/* Extendend user information. /* Extendend user information.
@ -106,6 +107,14 @@ public:
void exit (UINT n, bool norecord = 0) __attribute__ ((noreturn, regparm(2))); void exit (UINT n, bool norecord = 0) __attribute__ ((noreturn, regparm(2)));
inline void set_has_pgid_children ()
{
if (pgid == pid)
has_pgid_children = 1;
}
inline void set_has_pgid_children (bool val) {has_pgid_children = val;}
inline struct sigaction& getsig (int sig) inline struct sigaction& getsig (int sig)
{ {
return thread2signal ? thread2signal->sigs[sig] : sigs[sig]; return thread2signal ? thread2signal->sigs[sig] : sigs[sig];
@ -158,7 +167,7 @@ public:
if (destroy && procinfo) if (destroy && procinfo)
release (); release ();
} }
_pinfo *operator -> () const {return procinfo;} _pinfo *operator -> () const {return procinfo;}
int operator == (pinfo *x) const {return x->procinfo == procinfo;} int operator == (pinfo *x) const {return x->procinfo == procinfo;}
int operator == (pinfo &x) const {return x.procinfo == procinfo;} int operator == (pinfo &x) const {return x.procinfo == procinfo;}

View File

@ -678,6 +678,7 @@ skip_arg_parsing:
} }
else else
{ {
myself->set_has_pgid_children ();
ProtectHandle (pi.hThread); ProtectHandle (pi.hThread);
pinfo child (cygpid, 1); pinfo child (cygpid, 1);
if (!child) if (!child)

View File

@ -1711,6 +1711,8 @@ setpgid (pid_t pid, pid_t pgid)
if (p == myself || p->ppid == myself->pid) if (p == myself || p->ppid == myself->pid)
{ {
p->pgid = pgid; p->pgid = pgid;
if (p->pid != p->pgid)
p->set_has_pgid_children (0);
res = 0; res = 0;
} }
else else