[Lldb-commits] [PATCH] D17420: Don't use an atexit handler for cleaning up process specific temp dir

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 18 15:13:41 PST 2016


zturner created this revision.
zturner added reviewers: clayborg, labath, amccarth.
zturner added a subscriber: lldb-commits.

For seemingly no reason today, I started getting crashes on exit in `CleanupProcessSpecificTempDirectory` when I ran certain tests.  I determined this wasn't related to a code change, and when I looked in my temp lldb directory, I had close to 1500 process specific temp directories that had never been cleaned up, some dating back over 1 year ago.

Best I can figure out is that in the case of running the test suite, we've installed an atexit handler for the python executable itself.  Which means it will call this atexit handler after it has already (presumably) unloaded our extension module, leading to undefined behavior.

Whatever the cause, atexit handlers are dangerous because of the restrictions on what kind of code you can run in them.  I moved this to an explicit cleanup on `Terminate`, and verified that there are no more crashes on exit, and additionally the process specific temp directory is now correctly cleaned up after every test.

I don't know how (or even if) this was ever working on other platforms besides Windows, but you guys should check your temp/lldb directory and see if there are thousands of directories in there.

http://reviews.llvm.org/D17420

Files:
  include/lldb/Host/HostInfoBase.h
  source/Host/common/HostInfoBase.cpp
  source/Initialization/SystemInitializerCommon.cpp

Index: source/Initialization/SystemInitializerCommon.cpp
===================================================================
--- source/Initialization/SystemInitializerCommon.cpp
+++ source/Initialization/SystemInitializerCommon.cpp
@@ -197,6 +197,7 @@
 #endif
     OperatingSystemGo::Terminate();
 
+    HostInfoBase::Terminate();
     Log::Terminate();
 
 #if defined(_MSC_VER)
Index: source/Host/common/HostInfoBase.cpp
===================================================================
--- source/Host/common/HostInfoBase.cpp
+++ source/Host/common/HostInfoBase.cpp
@@ -82,6 +82,14 @@
     g_fields = new HostInfoBaseFields();
 }
 
+void
+HostInfoBase::Terminate()
+{
+    CleanupProcessSpecificLLDBTempDir();
+    delete g_fields;
+    g_fields = nullptr;
+}
+
 uint32_t
 HostInfoBase::GetNumberCPUS()
 {
@@ -335,9 +343,6 @@
     if (!FileSystem::MakeDirectory(temp_file_spec, eFilePermissionsDirectoryDefault).Success())
         return false;
 
-    // Make an atexit handler to clean up the process specify LLDB temp dir
-    // and all of its contents.
-    ::atexit(CleanupProcessSpecificLLDBTempDir);
     file_spec.GetDirectory().SetCString(temp_file_spec.GetCString());
     return true;
 }
Index: include/lldb/Host/HostInfoBase.h
===================================================================
--- include/lldb/Host/HostInfoBase.h
+++ include/lldb/Host/HostInfoBase.h
@@ -34,6 +34,8 @@
 
   public:
     static void Initialize();
+    static void
+    Terminate();
 
     //------------------------------------------------------------------
     /// Returns the number of CPUs on this current host.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D17420.48410.patch
Type: text/x-patch
Size: 1618 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160218/97f6308f/attachment.bin>


More information about the lldb-commits mailing list