OSDN Git Service

* exceptions.cc (sigpacket::process): Move signal_exit processing into...
authorcgf <cgf>
Sat, 26 Nov 2011 02:35:47 +0000 (02:35 +0000)
committercgf <cgf>
Sat, 26 Nov 2011 02:35:47 +0000 (02:35 +0000)
(_cygtls::signal_exit): ...here.  Close my_readsig and comment on why.
* pinfo.cc (pinfo::exit): Move sigproc_terminate earlier.  Set exiting flag in
lock_process.
* sigproc.cc (my_readsig): Make global.
* sync.cc (muto::exiting_thread): Delete.
(muto::acquire): Delete #if 0'ed code.
* sync.h (muto::exiting_thread): Delete.
(set_exiting_thread): Ditto.
(lock_process::lock_process): Don't worry about setting the exiting thread
since it had no meaning.

winsup/cygwin/ChangeLog
winsup/cygwin/exceptions.cc
winsup/cygwin/pinfo.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/sync.cc
winsup/cygwin/sync.h

index 32066c4..a3f1e94 100644 (file)
@@ -1,3 +1,17 @@
+2011-11-25  Christopher Faylor  <me.cygwin2011@cgf.cx>
+
+       * exceptions.cc (sigpacket::process): Move additional processing into...
+       (_cygtls::signal_exit): ...here.  Close my_readsig and comment on why.
+       * pinfo.cc (pinfo::exit): Move sigproc_terminate earlier.  Set exiting
+       flag in lock_process.
+       * sigproc.cc (my_readsig): Make global.
+       * sync.cc (muto::exiting_thread): Delete.
+       (muto::acquire): Delete #if 0'ed code.
+       * sync.h (muto::exiting_thread): Delete.
+       (set_exiting_thread): Ditto.
+       (lock_process::lock_process): Don't worry about setting the exiting
+       thread since it had no meaning.
+
 2011-11-24  Christopher Faylor  <me.cygwin2011@cgf.cx>
 
        * cygthread.cc (cygthread::name): Default name to "main" if we are early
index 98707e2..b84a9fb 100644 (file)
@@ -1307,17 +1307,6 @@ thread_specific:
   goto done;
 
 exit_sig:
-  if (si.si_signo == SIGQUIT || si.si_signo == SIGABRT)
-    {
-      CONTEXT c;
-      c.ContextFlags = CONTEXT_FULL;
-      GetThreadContext (hMainThread, &c);
-      use_tls->copy_context (&c);
-      if (cygheap->rlim_core > 0UL)
-       si.si_signo |= 0x80;
-    }
-  SetEvent (signal_arrived);   // To avoid a potential deadlock with proc_lock
-  sigproc_printf ("signal %d, about to call do_exit", si.si_signo);
   use_tls->signal_exit (si.si_signo);  /* never returns */
 }
 
@@ -1327,6 +1316,20 @@ exit_sig:
 void
 _cygtls::signal_exit (int rc)
 {
+  extern HANDLE my_readsig;
+  ForceCloseHandle (my_readsig); /* Disallow further signal sends */
+  SetEvent (signal_arrived);    /* Avoid potential deadlock with proc_lock */
+
+  if (rc == SIGQUIT || rc == SIGABRT)
+    {
+      CONTEXT c;
+      c.ContextFlags = CONTEXT_FULL;
+      GetThreadContext (hMainThread, &c);
+      copy_context (&c);
+      if (cygheap->rlim_core > 0UL)
+       rc |= 0x80;
+    }
+
   if (have_execed)
     {
       sigproc_printf ("terminating captive process");
index 48a5a99..d3e68bf 100644 (file)
@@ -181,7 +181,8 @@ void
 pinfo::exit (DWORD n)
 {
   minimal_printf ("winpid %d, exit %d", GetCurrentProcessId (), n);
-  lock_process until_exit ();
+  sigproc_terminate (ES_FINAL);
+  lock_process until_exit (true);
   cygthread::terminate ();
 
   if (n != EXITCODE_NOSET)
@@ -192,7 +193,6 @@ pinfo::exit (DWORD n)
       maybe_set_exit_code_from_windows ();
     }
 
-  sigproc_terminate (ES_FINAL);
   if (myself->ctty > 0 && !iscons_dev (myself->ctty))
     {
       lock_ttys here;
index d3737e3..e834f0b 100644 (file)
@@ -64,7 +64,7 @@ Static muto sync_proc_subproc;        // Control access to subproc stuff
 _cygtls NO_COPY *_sig_tls;
 
 Static HANDLE my_sendsig;
-Static HANDLE my_readsig;
+HANDLE NO_COPY my_readsig;
 
 /* Function declarations */
 static int __stdcall checkstate (waitq *) __attribute__ ((regparm (1)));
index 58b8549..0731fd1 100644 (file)
@@ -20,7 +20,6 @@ details. */
 
 #undef WaitForSingleObject
 
-DWORD NO_COPY muto::exiting_thread;
 muto NO_COPY lock_process::locker;
 
 void
@@ -76,10 +75,6 @@ int
 muto::acquire (DWORD ms)
 {
   void *this_tls = &_my_tls;
-#if 0
-  if (exiting_thread)
-    return this_tid == exiting_thread;
-#endif
 
   if (tls != this_tls)
     {
index 5d66b97..2215599 100644 (file)
@@ -17,7 +17,6 @@ class muto
 public:
   const char *name;
 private:
-  static DWORD exiting_thread;
   LONG sync;   /* Used to serialize access to this class. */
   LONG waiters;        /* Number of threads waiting for lock. */
   HANDLE bruteforce; /* event handle used to control waiting for lock. */
@@ -39,7 +38,6 @@ public:
   void upforgrabs () {tls = this;}  // just set to an invalid address
   void grab () __attribute__ ((regparm (1)));
   operator int () const {return !!name;}
-  static void set_exiting_thread () {exiting_thread = GetCurrentThreadId ();}
 };
 
 class lock_process
@@ -54,10 +52,7 @@ public:
     locker.acquire ();
     skip_unlock = exiting;
     if (exiting && exit_state < ES_PROCESS_LOCKED)
-      {
-       exit_state = ES_PROCESS_LOCKED;
-       muto::set_exiting_thread ();
-      }
+      exit_state = ES_PROCESS_LOCKED;
   }
   ~lock_process ()
   {