* 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:
parent
ce93dfe415
commit
76ef40d69f
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 ())
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue