OSDN Git Service

Make sure critical sections are entered before trying to leave them.
authorReid Spencer <rspencer@reidspencer.com>
Fri, 17 Sep 2004 03:02:27 +0000 (03:02 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Fri, 17 Sep 2004 03:02:27 +0000 (03:02 +0000)
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

lib/System/Win32/Signals.cpp
lib/System/Win32/Signals.inc

index d1bd2e8..130d3d6 100644 (file)
@@ -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;
 }
 
index d1bd2e8..130d3d6 100644 (file)
@@ -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;
 }