Author: gclayton
Date: Wed May 27 22:24:30 2015
New Revision: 238392

URL: http://llvm.org/viewvc/llvm-project?rev=238392&view=rev
Log:
I finally found the strong reference that was keeping all lldb_private::Process 
instances from ever destroying themselves: ProcessModID.m_mod_id was holding 
onto the last stop event with 
ProcessModID::SetStopEventForLastNaturalStopID(EventSP). This is a bad idea 
because ProcessEventData contains a strong refereence to the process. This is 
now fixed by calling ProcessModID::SetStopEventForLastNaturalStopID(EventSP()) 
to clear this event in Process::SetExitStatus() and in Process::Finalize().

This was the original cause of the file descriptor leaks that would cause the 
test suite to die after running a few hundred processes since no process would 
ever get destroyed and the communication channel in ProcessGDBRemote and the 
ProcessIOHandler would never close their pipes. 

This process leak was previously worked around by closing the pipes when the 
communication channel was disconnected.

This was found by using "ptr_refs" from the heap.py in the lldb.macosx.heap 
module. It was able to find all strong references to the Process and helped me 
to figure out who was holding this extra reference.


Modified:
    lldb/trunk/source/Target/Process.cpp

Modified: lldb/trunk/source/Target/Process.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=238392&r1=238391&r2=238392&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Wed May 27 22:24:30 2015
@@ -874,6 +874,9 @@ Process::Finalize()
     m_instrumentation_runtimes.clear();
     m_next_event_action_ap.reset();
     m_stop_info_override_callback = NULL;
+    // Clear the last natural stop ID since it has a strong
+    // reference to this process
+    m_mod_id.SetStopEventForLastNaturalStopID(EventSP());
 //#ifdef LLDB_CONFIGURATION_DEBUG
 //    StreamFile s(stdout, false);
 //    EventSP event_sp;
@@ -1467,6 +1470,10 @@ Process::SetExitStatus (int status, cons
         m_process_input_reader.reset();
     }
 
+    // Clear the last natural stop ID since it has a strong
+    // reference to this process
+    m_mod_id.SetStopEventForLastNaturalStopID(EventSP());
+
     SetPrivateState (eStateExited);
 
     // Allow subclasses to do some cleanup


_______________________________________________
lldb-commits mailing list
lldb-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to