* child_info.h (child_status): Fix typo which made it impossible to set

iscygwin.
(child_info::isstraced): Booleanize.
(child_info::iscygwin): Ditto.
* sigproc.cc (child_info::child_info): Minor cleanup of flag setting.
* spawn.cc (spawn_guts): Only close_all_files when we know the process has
started successfully.
* exceptions.cc (init_console_handler): Fix indentation.
This commit is contained in:
Christopher Faylor 2006-03-22 03:20:28 +00:00
parent ce93dfe415
commit 76ef40d69f
5 changed files with 39 additions and 23 deletions

View File

@ -1,3 +1,15 @@
2006-03-21 Christopher Faylor <cgf@timesys.com>
* child_info.h (child_status): Fix typo which made it impossible to set
iscygwin.
(child_info::isstraced): Booleanize.
(child_info::iscygwin): Ditto.
* sigproc.cc (child_info::child_info): Minor cleanup of flag setting.
* spawn.cc (spawn_guts): Only close_all_files when we know the process
has started successfully.
* exceptions.cc (init_console_handler): Fix indentation.
2006-03-20 Christopher Faylor <cgf@timesys.com> 2006-03-20 Christopher Faylor <cgf@timesys.com>
* dcrt0.cc (dll_crt0_0): Call SetErrorMode earlier. * dcrt0.cc (dll_crt0_0): Call SetErrorMode earlier.

View File

@ -21,7 +21,7 @@ enum child_info_types
enum child_status enum child_status
{ {
_CI_STRACED = 0x01, _CI_STRACED = 0x01,
_CI_ISCYGWIN = 0x0 _CI_ISCYGWIN = 0x02
}; };
#define OPROC_MAGIC_MASK 0xff00ff00 #define OPROC_MAGIC_MASK 0xff00ff00
@ -36,7 +36,7 @@ enum child_status
#define EXEC_MAGIC_SIZE sizeof(child_info) #define EXEC_MAGIC_SIZE sizeof(child_info)
/* Change this value if you get a message indicating that it is out-of-sync. */ /* Change this value if you get a message indicating that it is out-of-sync. */
#define CURR_CHILD_INFO_MAGIC 0xa189e57U #define CURR_CHILD_INFO_MAGIC 0x1630848cU
/* NOTE: Do not make gratuitous changes to the names or organization of the /* NOTE: Do not make gratuitous changes to the names or organization of the
below class. The layout is checksummed to determine compatibility between below class. The layout is checksummed to determine compatibility between
@ -66,8 +66,8 @@ public:
void ready (bool); void ready (bool);
bool sync (int, HANDLE&, DWORD) __attribute__ ((regparm (3))); bool sync (int, HANDLE&, DWORD) __attribute__ ((regparm (3)));
DWORD proc_retry (HANDLE) __attribute__ ((regparm (2))); DWORD proc_retry (HANDLE) __attribute__ ((regparm (2)));
bool isstraced () const {return flag & _CI_STRACED;} bool isstraced () const {return !!(flag & _CI_STRACED);}
bool iscygwin () const {return flag & _CI_ISCYGWIN;} bool iscygwin () const {return !!(flag & _CI_ISCYGWIN);}
}; };
class mount_info; class mount_info;

View File

@ -104,9 +104,9 @@ init_console_handler (bool install_handler)
{ {
BOOL res; BOOL res;
SetConsoleCtrlHandler (ctrl_c_handler, FALSE); SetConsoleCtrlHandler (ctrl_c_handler, FALSE);
if (wincap.has_null_console_handler_routine ()) if (wincap.has_null_console_handler_routine ())
SetConsoleCtrlHandler (NULL, FALSE); SetConsoleCtrlHandler (NULL, FALSE);
if (install_handler) if (install_handler)
res = SetConsoleCtrlHandler (ctrl_c_handler, TRUE); res = SetConsoleCtrlHandler (ctrl_c_handler, TRUE);
else if (wincap.has_null_console_handler_routine ()) else if (wincap.has_null_console_handler_routine ())

View File

@ -780,16 +780,16 @@ child_info::child_info (unsigned in_cb, child_info_types chtype, bool need_subpr
type = chtype; type = chtype;
fhandler_union_cb = sizeof (fhandler_union); fhandler_union_cb = sizeof (fhandler_union);
user_h = cygwin_user_h; user_h = cygwin_user_h;
if (need_subproc_ready)
subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
sigproc_printf ("subproc_ready %p", subproc_ready);
cygheap = ::cygheap;
cygheap_max = ::cygheap_max;
flag = 0;
if (strace.attached ()) if (strace.attached ())
flag |= _CI_STRACED; flag |= _CI_STRACED;
if (need_subproc_ready) if (need_subproc_ready)
flag |= _CI_ISCYGWIN; {
subproc_ready = CreateEvent (&sec_all, FALSE, FALSE, NULL);
flag |= _CI_ISCYGWIN;
}
sigproc_printf ("subproc_ready %p", subproc_ready);
cygheap = ::cygheap;
cygheap_max = ::cygheap_max;
retry = child_info::retry_count; retry = child_info::retry_count;
/* Create an inheritable handle to pass to the child process. This will /* Create an inheritable handle to pass to the child process. This will
allow the child to duplicate handles from the parent to itself. */ allow the child to duplicate handles from the parent to itself. */

View File

@ -777,8 +777,6 @@ loop:
strace.execing = 1; strace.execing = 1;
myself.hProcess = hExeced = pi.hProcess; myself.hProcess = hExeced = pi.hProcess;
strcpy (myself->progname, real_path); // FIXME: race? strcpy (myself->progname, real_path); // FIXME: race?
if (!looped)
close_all_files (true);
sigproc_printf ("new process name %s", myself->progname); sigproc_printf ("new process name %s", myself->progname);
/* If wr_proc_pipe doesn't exist then this process was not started by a cygwin /* If wr_proc_pipe doesn't exist then this process was not started by a cygwin
process. So, we need to wait around until the process we've just "execed" process. So, we need to wait around until the process we've just "execed"
@ -864,19 +862,25 @@ loop:
myself->wr_proc_pipe_owner = GetCurrentProcessId (); myself->wr_proc_pipe_owner = GetCurrentProcessId ();
myself->wr_proc_pipe = orig_wr_proc_pipe; myself->wr_proc_pipe = orig_wr_proc_pipe;
} }
if (ch.proc_retry (pi.hProcess) == 0) DWORD res = ch.proc_retry (pi.hProcess);
if (!res)
{ {
looped++; looped++;
goto loop; goto loop;
} }
close_all_files (true);
} }
else if (!myself->wr_proc_pipe else
&& WaitForSingleObject (pi.hProcess, 0) == WAIT_TIMEOUT)
{ {
extern bool is_toplevel_proc; close_all_files (true);
is_toplevel_proc = true; if (!myself->wr_proc_pipe
myself.remember (false); && WaitForSingleObject (pi.hProcess, 0) == WAIT_TIMEOUT)
waitpid (myself->pid, &res, 0); {
extern bool is_toplevel_proc;
is_toplevel_proc = true;
myself.remember (false);
waitpid (myself->pid, &res, 0);
}
} }
myself.exit (EXITCODE_NOSET); myself.exit (EXITCODE_NOSET);
break; break;