OSDN Git Service

* dcrt0.cc (do_exit): Don't set ES_SET_MUTO here. Call get_exit_lock()
authorcgf <cgf>
Fri, 30 Sep 2005 23:52:12 +0000 (23:52 +0000)
committercgf <cgf>
Fri, 30 Sep 2005 23:52:12 +0000 (23:52 +0000)
instead.
(get_exit_lock): New function.  Grabs the lock and sets initial exit_state.
* exceptions.cc (try_to_debug): Use low_priority_sleep.
(sigpacket::process): Avoid handler if this is an exec stub.
(signal_exit): Use get_exit_lock rather than manipulating the exit_lock
critical section directly.
* pinfo.cc (pinfo::exit): Ditto.
* winsup.h (get_exit_lock): Declare.
(exit_lock): Delete declaration.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc
winsup/cygwin/exceptions.cc
winsup/cygwin/pinfo.cc
winsup/cygwin/winsup.h

index a7720f4..ce8d7ed 100644 (file)
@@ -1,3 +1,17 @@
+2005-09-30  Christopher Faylor  <cgf@timesys.com>
+
+       * dcrt0.cc (do_exit): Don't set ES_SET_MUTO here.  Call get_exit_lock()
+       instead.
+       (get_exit_lock): New function.  Grabs the lock and sets initial
+       exit_state.
+       * exceptions.cc (try_to_debug): Use low_priority_sleep.
+       (sigpacket::process): Avoid handler if this is an exec stub.
+       (signal_exit): Use get_exit_lock rather than manipulating the exit_lock
+       critical section directly.
+       * pinfo.cc (pinfo::exit): Ditto.
+       * winsup.h (get_exit_lock): Declare.
+       (exit_lock): Delete declaration.
+
 2005-09-30  Corinna Vinschen  <corinna@vinschen.de>
 
        * fhandler_disk_file.cc: Change calls to pc.set_attributes into
index 953c93e..1f88379 100644 (file)
@@ -1021,13 +1021,7 @@ do_exit (int status)
     }
 #endif
 
-  EnterCriticalSection (&exit_lock);
-
-  if (exit_state < ES_SET_MUTO)
-    {
-      exit_state = ES_SET_MUTO;
-      muto::set_exiting_thread ();
-    }
+  get_exit_lock ();
 
   if (exit_state < ES_GLOBAL_DTORS)
     {
@@ -1144,6 +1138,18 @@ _exit (int n)
   do_exit (((DWORD) n & 0xff) << 8);
 }
 
+void
+get_exit_lock ()
+{
+  extern CRITICAL_SECTION exit_lock;
+  EnterCriticalSection (&exit_lock);
+  if (exit_state < ES_SET_MUTO)
+    {
+      exit_state = ES_SET_MUTO;
+      muto::set_exiting_thread ();
+    }
+}
+
 extern "C" void
 __api_fatal (const char *fmt, ...)
 {
index 6811ecf..02b2f2b 100644 (file)
@@ -388,7 +388,7 @@ try_to_debug (bool waitloop)
        return dbg;
       SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
       while (!being_debugged ())
-       Sleep (0);
+       low_priority_sleep (0);
       Sleep (2000);
     }
 
@@ -1041,7 +1041,13 @@ sigpacket::process ()
   myself->rusage_self.ru_nsignals++;
 
   bool masked;
-  void *handler = (void *) thissig.sa_handler;
+  void *handler;
+  if (!hExeced || (void *) thissig.sa_handler == (void *) SIG_IGN)
+    handler = (void *) thissig.sa_handler;
+  else if (tls)
+    return 1;
+  else 
+    handler = NULL;
 
   if (si.si_signo == SIGKILL)
     goto exit_sig;
@@ -1175,7 +1181,7 @@ signal_exit (int rc)
       TerminateProcess (hExeced, sigExeced = rc);
     }
 
-  EnterCriticalSection (&exit_lock);
+  get_exit_lock ();
   if (hExeced || exit_state)
     myself.exit (rc);
 
index 5c2e2f8..7e63ef0 100644 (file)
@@ -140,7 +140,7 @@ pinfo::zap_cwd ()
 void
 pinfo::exit (DWORD n)
 {
-  EnterCriticalSection (&exit_lock);
+  get_exit_lock ();
   cygthread::terminate ();
   if (n != EXITCODE_NOSET)
     self->exitcode = EXITCODE_SET | n;/* We're really exiting.  Record the UNIX exit code. */
index f9004e1..004f5b9 100644 (file)
@@ -203,6 +203,7 @@ enum exit_states
 
 extern exit_states exit_state;
 void __stdcall do_exit (int) __attribute__ ((regparm (1), noreturn));
+void __stdcall get_exit_lock ();
 
 /* UID/GID */
 void uinfo_init ();
@@ -347,7 +348,6 @@ extern HANDLE hMainProc;
 extern HANDLE hProcToken;
 extern HANDLE hProcImpToken;
 extern HANDLE hExeced;
-extern CRITICAL_SECTION exit_lock;
 
 extern bool cygwin_testing;