mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-21 16:26:12 +08:00
* child_info.h (_CI_SAW_CTRL_C): New enum.
(CURR_CHILD_INFO_MAGIC): Reset. (saw_ctrl_c): New function. (set_saw_ctrl_c): Ditto. * sigproc.cc (child_info::proc_retry): Return EXITCODE_OK if we get STATUS_CONTROL_C_EXIT and we actually saw a CTRL-C. * spawn.cc (dwExeced): Delete. (chExeced): New variable. (spawn_guts): Set chExeced; * exceptions.cc (dwExeced): Delete declaration. (chExeced): Declare. (ctrl_c_handler): Detect if we're an exec stub process and set a flag, if so. * fhandler_tty.cc (fhandler_tty_common::__release_output_mutex): Add extra DEBUGGING test. * pinfo.cc: Fix comment.
This commit is contained in:
parent
8ae1d98d8e
commit
6813f009ba
@ -1,3 +1,24 @@
|
|||||||
|
2006-05-21 Christopher Faylor <cgf@timesys.com>
|
||||||
|
|
||||||
|
* child_info.h (_CI_SAW_CTRL_C): New enum.
|
||||||
|
(CURR_CHILD_INFO_MAGIC): Reset.
|
||||||
|
(saw_ctrl_c): New function.
|
||||||
|
(set_saw_ctrl_c): Ditto.
|
||||||
|
* sigproc.cc (child_info::proc_retry): Return EXITCODE_OK if we get
|
||||||
|
STATUS_CONTROL_C_EXIT and we actually saw a CTRL-C.
|
||||||
|
* spawn.cc (dwExeced): Delete.
|
||||||
|
(chExeced): New variable.
|
||||||
|
(spawn_guts): Set chExeced;
|
||||||
|
* exceptions.cc (dwExeced): Delete declaration.
|
||||||
|
(chExeced): Declare.
|
||||||
|
(ctrl_c_handler): Detect if we're an exec stub process and set a flag,
|
||||||
|
if so.
|
||||||
|
|
||||||
|
* fhandler_tty.cc (fhandler_tty_common::__release_output_mutex): Add
|
||||||
|
extra DEBUGGING test.
|
||||||
|
|
||||||
|
* pinfo.cc: Fix comment.
|
||||||
|
|
||||||
2006-05-21 Christopher Faylor <cgf@timesys.com>
|
2006-05-21 Christopher Faylor <cgf@timesys.com>
|
||||||
|
|
||||||
* fhandle.h (fhandler_pipe::create_guard): Revert change which
|
* fhandle.h (fhandler_pipe::create_guard): Revert change which
|
||||||
|
@ -20,8 +20,10 @@ enum child_info_types
|
|||||||
|
|
||||||
enum child_status
|
enum child_status
|
||||||
{
|
{
|
||||||
_CI_STRACED = 0x01,
|
_CI_STRACED = 0x01,
|
||||||
_CI_ISCYGWIN = 0x02
|
_CI_ISCYGWIN = 0x02,
|
||||||
|
_CI_SAW_CTRL_C = 0x04
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define OPROC_MAGIC_MASK 0xff00ff00
|
#define OPROC_MAGIC_MASK 0xff00ff00
|
||||||
@ -36,7 +38,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 0x110015eaU
|
#define CURR_CHILD_INFO_MAGIC 0x704d1f7eU
|
||||||
|
|
||||||
/* 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
|
||||||
@ -68,6 +70,8 @@ public:
|
|||||||
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);}
|
||||||
|
bool saw_ctrl_c () const {return !!(flag & _CI_SAW_CTRL_C);}
|
||||||
|
void set_saw_ctrl_c () {flag |= _CI_SAW_CTRL_C;}
|
||||||
};
|
};
|
||||||
|
|
||||||
class mount_info;
|
class mount_info;
|
||||||
|
@ -31,6 +31,7 @@ details. */
|
|||||||
#include "fhandler.h"
|
#include "fhandler.h"
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
|
#include "child_info.h"
|
||||||
|
|
||||||
#define CALL_HANDLER_RETRY 20
|
#define CALL_HANDLER_RETRY 20
|
||||||
|
|
||||||
@ -40,7 +41,7 @@ extern "C" {
|
|||||||
extern void sigdelayed ();
|
extern void sigdelayed ();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern NO_COPY DWORD dwExeced;
|
extern child_info_spawn *chExeced;
|
||||||
int NO_COPY sigExeced;
|
int NO_COPY sigExeced;
|
||||||
|
|
||||||
static BOOL WINAPI ctrl_c_handler (DWORD);
|
static BOOL WINAPI ctrl_c_handler (DWORD);
|
||||||
@ -944,10 +945,11 @@ ctrl_c_handler (DWORD type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we are a stub and the new process has a pinfo structure, let it
|
if (chExeced)
|
||||||
handle this signal. */
|
{
|
||||||
if (dwExeced && pinfo (dwExeced))
|
chExeced->set_saw_ctrl_c ();
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* We're only the process group leader when we have a valid pinfo structure.
|
/* We're only the process group leader when we have a valid pinfo structure.
|
||||||
If we don't have one, then the parent "stub" will handle the signal. */
|
If we don't have one, then the parent "stub" will handle the signal. */
|
||||||
|
@ -148,6 +148,13 @@ fhandler_tty_common::__release_output_mutex (const char *fn, int ln)
|
|||||||
ostack[osi].ln = -ln;
|
ostack[osi].ln = -ln;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUGGING
|
||||||
|
else if (osi > 0)
|
||||||
|
{
|
||||||
|
system_printf ("couldn't release output mutex but we seem to own it, %E");
|
||||||
|
try_to_debug ();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process tty input. */
|
/* Process tty input. */
|
||||||
|
@ -41,8 +41,8 @@ pinfo NO_COPY myself ((_pinfo *)&pinfo_dummy); // Avoid myself != NULL checks
|
|||||||
|
|
||||||
bool is_toplevel_proc;
|
bool is_toplevel_proc;
|
||||||
|
|
||||||
/* Initialize the process table.
|
/* Setup the pinfo structure for this process. There may already be a
|
||||||
This is done once when the dll is first loaded. */
|
_pinfo for this "pid" if h != NULL. */
|
||||||
|
|
||||||
void __stdcall
|
void __stdcall
|
||||||
set_myself (HANDLE h)
|
set_myself (HANDLE h)
|
||||||
|
@ -910,6 +910,9 @@ child_info::proc_retry (HANDLE h)
|
|||||||
sigproc_printf ("STILL_ACTIVE? How'd we get here?");
|
sigproc_printf ("STILL_ACTIVE? How'd we get here?");
|
||||||
break;
|
break;
|
||||||
case STATUS_CONTROL_C_EXIT:
|
case STATUS_CONTROL_C_EXIT:
|
||||||
|
if (saw_ctrl_c ())
|
||||||
|
return EXITCODE_OK;
|
||||||
|
/* fall through intentionally */
|
||||||
case STATUS_DLL_INIT_FAILED:
|
case STATUS_DLL_INIT_FAILED:
|
||||||
case STATUS_DLL_INIT_FAILED_LOGOFF:
|
case STATUS_DLL_INIT_FAILED_LOGOFF:
|
||||||
case EXITCODE_RETRY:
|
case EXITCODE_RETRY:
|
||||||
|
@ -52,7 +52,7 @@ static suffix_info dll_suffixes[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
HANDLE hExeced;
|
HANDLE hExeced;
|
||||||
DWORD dwExeced;
|
child_info_spawn *chExeced;
|
||||||
|
|
||||||
/* Add .exe to PROG if not already present and see if that exists.
|
/* Add .exe to PROG if not already present and see if that exists.
|
||||||
If not, return PROG (converted from posix to win32 rules if necessary).
|
If not, return PROG (converted from posix to win32 rules if necessary).
|
||||||
@ -583,7 +583,8 @@ loop:
|
|||||||
pid_t pid;
|
pid_t pid;
|
||||||
if (mode == _P_OVERLAY)
|
if (mode == _P_OVERLAY)
|
||||||
{
|
{
|
||||||
myself->dwProcessId = dwExeced = pi.dwProcessId;
|
chExeced = &ch; /* FIXME: there's a race here if a user sneaks in CTRL-C */
|
||||||
|
myself->dwProcessId = pi.dwProcessId;
|
||||||
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?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user