* 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:
Christopher Faylor 2006-05-22 04:50:54 +00:00
parent 8ae1d98d8e
commit 6813f009ba
7 changed files with 50 additions and 12 deletions

View File

@ -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

View File

@ -21,7 +21,9 @@ 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;

View File

@ -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. */

View File

@ -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. */

View File

@ -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)

View File

@ -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:

View File

@ -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?