* 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:
parent
8c8d0db462
commit
f8f9b12e6c
@ -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.
|
||||||
|
@ -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 ();
|
||||||
|
@ -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);
|
||||||
|
@ -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;}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user