* pinfo.h (_pinfo::set_exit_state): Declare new function.

(pinfo::exit): Move here from _pinfo::exit.
* sigproc.cc (child_info::sync): Use new function to set exitcode and
process_state.
* pinfo.cc (_pinfo::exit): Ditto.
(proc_waiter): Ditto.
(_pinfo::set_exit_state): Define new function.
(_pinfo::dup_proc_pipe): Close handle when there is no parent process around to
care about the exit value.
* dcrt0.cc (dll_crt0_0): Move subproc_ready synchronization later to make sure
that myself is still mapped in parent.
(do_exit): Reflect movement to pinfo::exit.
(__api_fatal): Ditto.
* exceptions.cc (signal_exit): Ditto.
* errno.cc (errmap): Map PROC_NOT_FOUND.
* init.cc (dll_entry): Release myself before exiting.
* sigproc.cc (proc_can_be_signalled): Set errno appropriately.
(sig_send): Ditto.  Also remove ill-advised test for !myself->sendsig since
this is an indication of a process which is still initializating -- it is not
an error.
(child_info::sync): Don't set exitcode here.  Assume that will happen in
proc_waiter, if necessary.
* spawn.cc (spawn_guts): Delay "wait_for_myself" logic until later.  Don't wait
at all if the process has already exited.  Reflect movement to pinfo::exit.
This commit is contained in:
Christopher Faylor
2005-01-11 15:31:04 +00:00
parent aa67a4484e
commit 2380dfe14c
10 changed files with 149 additions and 100 deletions

View File

@@ -625,12 +625,8 @@ dll_crt0_0 ()
else if (sizeof (fhandler_union) != child_proc_info->fhandler_union_cb)
multiple_cygwin_problem ("fhandler size", child_proc_info->fhandler_union_cb, sizeof (fhandler_union));
else
{
if (child_proc_info->type != _PROC_FORK)
child_proc_info->ready (true);
cygwin_user_h = child_proc_info->user_h;
break;
}
cygwin_user_h = child_proc_info->user_h;
break;
default:
system_printf ("unknown exec type %d", child_proc_info->type);
/* intentionally fall through */
@@ -667,6 +663,8 @@ dll_crt0_0 ()
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
h = NULL;
set_myself (h);
if (child_proc_info->type != _PROC_FORK)
child_proc_info->ready (true);
__argc = spawn_info->moreinfo->argc;
__argv = spawn_info->moreinfo->argv;
envp = spawn_info->moreinfo->envp;
@@ -1060,7 +1058,7 @@ do_exit (int status)
}
minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
myself->exit (n);
myself.exit (n);
}
static muto *atexit_lock;
@@ -1123,7 +1121,7 @@ __api_fatal (const char *fmt, ...)
#ifdef DEBUGGING
(void) try_to_debug ();
#endif
myself->exit (1);
myself.exit (1);
}
void