summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/exceptions.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r--winsup/cygwin/exceptions.cc28
1 files changed, 14 insertions, 14 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 16b845038..e71c4a7b1 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -992,11 +992,6 @@ exit_sig:
sig |= 0x80;
}
sigproc_printf ("signal %d, about to call do_exit", sig);
- TerminateThread (hMainThread, 0);
- /* FIXME: This just works around the problem so that we don't attempt to
- use a resource lock when exiting. */
- user_data->resourcelocks->Delete ();
- user_data->resourcelocks->Init ();
signal_exit (sig);
/* Never returns */
}
@@ -1007,15 +1002,6 @@ exit_sig:
static void
signal_exit (int rc)
{
- /* If the exception handler gets a trap, we could recurse awhile.
- If this is non-zero, skip the cleaning up and exit NOW. */
-
- muto *m;
- /* FIXME: Make multi-thread aware */
- for (m = muto_start.next; m != NULL; m = m->next)
- if (m->unstable () || m->owner () == mainthread.id)
- m->reset ();
-
rc = EXIT_SIGNAL | (rc << 8);
if (exit_already++)
{
@@ -1024,6 +1010,20 @@ signal_exit (int rc)
ExitProcess (rc);
}
+ /* We'd like to stop the main thread from executing but when we do that it
+ causes random, inexplicable hangs. So, instead, we set up the priority
+ of this thread really high so that it should do its thing and then exit. */
+ (void) SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
+
+ /* Unlock any main thread mutos since we're executing with prejudice. */
+ muto *m;
+ for (m = muto_start.next; m != NULL; m = m->next)
+ if (m->unstable () || m->owner () == mainthread.id)
+ m->reset ();
+
+ user_data->resourcelocks->Delete ();
+ user_data->resourcelocks->Init ();
+
do_exit (rc);
}