? tcp->parent
: tcp->nclone_detached > 0
? tcp : NULL);
+ fprintf(stderr,"handle_group_exit (%d [%d], %d)\n", tcp->pid,
+ leader? leader->pid:-1, sig);
if (sig < 0) {
- if (leader != NULL && leader != tcp)
+ if (leader != NULL && leader != tcp &&
+ !(leader->flags & TCB_GROUP_EXITING))
fprintf(stderr,
"PANIC: handle_group_exit: %d leader %d\n",
tcp->pid, leader ? leader->pid : -1);
}
else {
if (tcp->flags & TCB_ATTACHED) {
- if (leader != NULL && leader != tcp) {
+ if (leader != NULL && leader != tcp &&
+ (leader->flags & TCB_ATTACHED)) {
/* We need to detach the leader so that the
process death will be reported to its real
parent. But we kill it first to prevent
return -1;
}
else {
+ if (leader != NULL)
+ leader->flags |= TCB_GROUP_EXITING;
if (leader != NULL && leader != tcp)
droptcb(tcp);
/* The leader will report to us as parent now,
if (WIFEXITED(status)) {
if (debug)
fprintf(stderr, "pid %u exited\n", pid);
- if (tcp->flags & TCB_ATTACHED)
+ if ((tcp->flags & TCB_ATTACHED)
+#ifdef TCB_GROUP_EXITING
+ && !(tcp->parent && (tcp->parent->flags &
+ TCB_GROUP_EXITING))
+#endif
+ )
fprintf(stderr,
"PANIC: attached pid %u exited\n",
pid);
strsignal(WSTOPSIG(status)), pc, addr);
printtrailer(tcp);
}
- if ((tcp->flags & TCB_ATTACHED) &&
+ if (((tcp->flags & TCB_ATTACHED) ||
+ tcp->nclone_threads > 0) &&
!sigishandled(tcp, WSTOPSIG(status))) {
#ifdef TCB_GROUP_EXITING
handle_group_exit(tcp, WSTOPSIG(status));