OSDN Git Service

* child_info.h (_CI_SAW_CTRL_C): New enum.
authorcgf <cgf>
Mon, 22 May 2006 04:50:53 +0000 (04:50 +0000)
committercgf <cgf>
Mon, 22 May 2006 04:50:53 +0000 (04:50 +0000)
(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.

winsup/cygwin/ChangeLog
winsup/cygwin/child_info.h
winsup/cygwin/exceptions.cc
winsup/cygwin/fhandler_tty.cc
winsup/cygwin/pinfo.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/spawn.cc

index d1481ee..9dd8d34 100644 (file)
@@ -1,5 +1,26 @@
 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>
+
        * fhandle.h (fhandler_pipe::create_guard): Revert change which
        eliminated SECURITY_ATTRIBUTES argument.
        * pipe.cc (fhandler_pipe::open): Duplicate guard from other process and
index 4d0ea01..7f1a88c 100644 (file)
@@ -20,8 +20,10 @@ enum child_info_types
 
 enum child_status
 {
-  _CI_STRACED  = 0x01,
-  _CI_ISCYGWIN = 0x02
+  _CI_STRACED   = 0x01,
+  _CI_ISCYGWIN  = 0x02,
+  _CI_SAW_CTRL_C = 0x04
+
 };
 
 #define OPROC_MAGIC_MASK 0xff00ff00
@@ -36,7 +38,7 @@ enum child_status
 #define EXEC_MAGIC_SIZE sizeof(child_info)
 
 /* 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
    below class.  The layout is checksummed to determine compatibility between
@@ -68,6 +70,8 @@ public:
   DWORD proc_retry (HANDLE) __attribute__ ((regparm (2)));
   bool isstraced () const {return !!(flag & _CI_STRACED);}
   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;
index b18d82a..fcc13d1 100644 (file)
@@ -31,6 +31,7 @@ details. */
 #include "fhandler.h"
 #include "dtable.h"
 #include "cygheap.h"
+#include "child_info.h"
 
 #define CALL_HANDLER_RETRY 20
 
@@ -40,7 +41,7 @@ extern "C" {
 extern void sigdelayed ();
 };
 
-extern NO_COPY DWORD dwExeced;
+extern child_info_spawn *chExeced;
 int NO_COPY sigExeced;
 
 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
-     handle this signal. */
-  if (dwExeced && pinfo (dwExeced))
-    return TRUE;
+  if (chExeced)
+    {
+      chExeced->set_saw_ctrl_c ();
+      return TRUE;
+    }
 
   /* 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. */
index 8539728..39691c6 100644 (file)
@@ -148,6 +148,13 @@ fhandler_tty_common::__release_output_mutex (const char *fn, int ln)
       ostack[osi].ln = -ln;
 #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. */
index 8aeaa64..504c1c9 100644 (file)
@@ -41,8 +41,8 @@ pinfo NO_COPY myself ((_pinfo *)&pinfo_dummy);        // Avoid myself != NULL checks
 
 bool is_toplevel_proc;
 
-/* Initialize the process table.
-   This is done once when the dll is first loaded.  */
+/* Setup the pinfo structure for this process.  There may already be a
+   _pinfo for this "pid" if h != NULL. */
 
 void __stdcall
 set_myself (HANDLE h)
index 9eb918d..5de0762 100644 (file)
@@ -910,6 +910,9 @@ child_info::proc_retry (HANDLE h)
       sigproc_printf ("STILL_ACTIVE?  How'd we get here?");
       break;
     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_LOGOFF:
     case EXITCODE_RETRY:
index 41f4054..9f04b30 100644 (file)
@@ -52,7 +52,7 @@ static suffix_info dll_suffixes[] =
 };
 
 HANDLE hExeced;
-DWORD dwExeced;
+child_info_spawn *chExeced;
 
 /* 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).
@@ -583,7 +583,8 @@ loop:
   pid_t pid;
   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;
       myself.hProcess = hExeced = pi.hProcess;
       strcpy (myself->progname, real_path); // FIXME: race?