Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2006-03-18 22:17:21 +0300
committerChristopher Faylor <me@cgf.cx>2006-03-18 22:17:21 +0300
commita939686807dd8e832939fddf514040fdba7077d8 (patch)
treee9e816e39dde05a3353c9137c9763f6d474adac9 /winsup/cygwin/sigproc.cc
parent61337a0f4594e1301011b775a6f9672fc58b4ec0 (diff)
* child_info.h (CURR_CHILD_INFO_MAGIC): Regenerate.
(child_info::retry): Move here from fork subclass. (child_info::exit_code): New field. (child_info::retry_count): Max retry count for process start. (child_info::proc_retry): Declare new function. (child_info_fork::retry): Move to parent. (child_info_fork::fork_retry): Ditto. * dcrt0.cc (child_info::fork_retry): Rename and move. (child_info_fork::handle_failure): Move. (dll_crt0_0): Initialize console handler based on whether we have a controlling tty or not. Avoid nonsensical check for fork where it can never occur. * environ.cc (set_proc_retry): Rename from set_fork_retry. Set retry_count in child_info. (parse_thing): Reflect above change. * exceptions.cc (dummy_ctrl_c_handler): Remove unused variable name. (ctrl_c_handler): Always return TRUE for the annoying CTRL_LOGOFF_EVENT. * fhandler_termios.cc (fhandler_termios::tcsetpgrp): Remove call to init_console_handler. * fhandler_tty.cc (fhandler_tty_slave::open): Just call mange_console_count here and let it decide what to do with initializing console control handling. * fork.cc (fork_retry): Remove definition. (frok::parent): Define static errbuf and use in error messages (not thread safe yet). Close pi.hThread as soon as possible. Protect pi.hProcess as soon as possible. Don't set retry_count. That happens automatically in the constructor now. Accommodate name change from fork_retry to proc_retry. * init.cc (dll_entry): Turn off ctrl-c handling early until we know how it is supposed to be handled. * pinfo.cc (_pinfo::dup_proc_pipe): Remember original proc pipe value for failure error message. Tweak debug message slightly. * sigproc.cc (child_info::retry_count): Define. (child_info::child_info): Initialize retry count. (child_info::sync): Set exit code if process dies before synchronization. (child_info::proc_retry): Rename from child_info_fork::fork_retry. Use previously derived exit code. Be more defensive about what is classified as an error exit. (child_info_fork::handle_failure): Move here from dcrt0.cc. * spawn.cc (spawn_guts): Maintain error mode when starting new process to avoid annoying pop ups. Move deimpersonate call within new loop. Move envblock freeing to end. Loop if process dies prematurely with bad exit code. * syscalls.cc (init_console_handler): Remove hopefully unneeded call to init_console_handler.
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r--winsup/cygwin/sigproc.cc50
1 files changed, 47 insertions, 3 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 4cd538c32..a213a5607 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -523,7 +523,7 @@ sig_send (_pinfo *p, int sig)
else
{
#ifdef DEBUGGING
- system_printf ("signal %d sent to %p while signals are on hold", p, sig);
+ system_printf ("signal %d sent to %p while signals are on hold", sig, p);
#endif
return -1;
}
@@ -767,6 +767,7 @@ out:
return rc;
}
+int child_info::retry_count = 10;
/* Initialize some of the memory block passed to child processes
by fork/spawn/exec. */
@@ -785,6 +786,7 @@ child_info::child_info (unsigned in_cb, child_info_types chtype, bool need_subpr
cygheap = ::cygheap;
cygheap_max = ::cygheap_max;
straced = strace.attached ();
+ retry = child_info::retry_count;
/* Create an inheritable handle to pass to the child process. This will
allow the child to duplicate handles from the parent to itself. */
parent = NULL;
@@ -862,21 +864,63 @@ child_info::sync (pid_t pid, HANDLE& hProcess, DWORD howlong)
else
{
if (x != nsubproc_ready)
- res = type != _PROC_FORK;
+ {
+ res = false;
+ GetExitCodeProcess (hProcess, &exit_code);
+ }
else
{
+ res = true;
+ exit_code = STILL_ACTIVE;
if (type == _PROC_EXEC && myself->wr_proc_pipe)
{
ForceCloseHandle1 (hProcess, childhProc);
hProcess = NULL;
}
- res = true;
}
sigproc_printf ("pid %u, WFMO returned %d, res %d", pid, x, res);
}
return res;
}
+DWORD
+child_info::proc_retry (HANDLE h)
+{
+ switch (exit_code)
+ {
+ case STILL_ACTIVE: /* shouldn't happen */
+ sigproc_printf ("STILL_ACTIVE? How'd we get here?");
+ break;
+ case STATUS_CONTROL_C_EXIT:
+ case STATUS_DLL_INIT_FAILED:
+ case STATUS_DLL_INIT_FAILED_LOGOFF:
+ case EXITCODE_RETRY:
+ if (retry-- > 0)
+ exit_code = 0;
+ break;
+ /* Count down non-recognized exit codes more quickly since they aren't
+ due to known conditions. */
+ default:
+ if ((exit_code & 0xc0000000) != 0xc0000000)
+ break;
+ if ((retry -= 2) < 0)
+ retry = 0;
+ else
+ exit_code = 0;
+ }
+ if (!exit_code)
+ ForceCloseHandle1 (h, childhProc);
+ return exit_code;
+}
+
+bool
+child_info_fork::handle_failure (DWORD err)
+{
+ if (retry > 0)
+ ExitProcess (EXITCODE_RETRY);
+ return 0;
+}
+
/* Check the state of all of our children to see if any are stopped or
* terminated.
*/