aboutsummaryrefslogtreecommitdiff
path: root/lib/System/Win32/Signals.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-09-17 03:02:27 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-09-17 03:02:27 +0000
commit298d6c14ca1936677aaf6cca3efc569b6e53d294 (patch)
treef501e28b69ac0f0e7328c0f728da9be7accf9cb9 /lib/System/Win32/Signals.cpp
parentf2b2d86d6bf9aba5b58833c291320b31f0840c09 (diff)
Make sure critical sections are entered before trying to leave them.
Add some additional commentary about the workings of this module. Patch contributed by Jeff Cohen. Thanks Jeff! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16383 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Win32/Signals.cpp')
-rw-r--r--lib/System/Win32/Signals.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/lib/System/Win32/Signals.cpp b/lib/System/Win32/Signals.cpp
index d1bd2e84e0..130d3d63a1 100644
--- a/lib/System/Win32/Signals.cpp
+++ b/lib/System/Win32/Signals.cpp
@@ -28,6 +28,10 @@ static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType);
static std::vector<std::string> *FilesToRemove = NULL;
static std::vector<llvm::sys::Path> *DirectoriesToRemove = NULL;
static bool RegisteredUnhandledExceptionFilter = false;
+
+// Windows creates a new thread to execute the console handler when an event
+// (such as CTRL/C) occurs. This causes concurrency issues with the above
+// globals which this critical section addresses.
static CRITICAL_SECTION CriticalSection;
namespace llvm {
@@ -40,7 +44,10 @@ namespace llvm {
static void RegisterHandler() {
if (RegisteredUnhandledExceptionFilter)
+ {
+ EnterCriticalSection(&CriticalSection);
return;
+ }
// Now's the time to create the critical section. This is the first time
// through here, and there's only one thread.
@@ -205,9 +212,13 @@ static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep) {
}
static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType) {
+ // FIXME: This handler executes on a different thread. The main thread
+ // is still running, potentially creating new files to be cleaned up
+ // in the tiny window between the call to Cleanup() and process termination.
+ // Also, any files currently open cannot be deleted.
Cleanup();
- // Allow normal processing to take place.
+ // Allow normal processing to take place; i.e., the process dies.
return FALSE;
}