cameron314 created this revision. cameron314 added reviewers: clayborg, zturner, jingham. cameron314 added subscribers: mamai, lldb-commits. cameron314 set the repository for this revision to rL LLVM.
When stopping the private state thread, there was a race condition between the time the thread exits (resetting the HostThread object) and the time a Join was attempted, especially in the case of a timeout. The previous workaround of copying the HostThread object is not enough, since on a Reset the internal thread stuff gets nulled out regardless of which HostThread object actually has Reset called on it, resulting in an attempt to dereference a null pointer on the subsequent call to Join from the copy as well. In our environment (custom target), we were hitting this every time we stopped debugging. Repository: rL LLVM http://reviews.llvm.org/D19122 Files: source/Target/Process.cpp Index: source/Target/Process.cpp =================================================================== --- source/Target/Process.cpp +++ source/Target/Process.cpp @@ -4112,11 +4112,8 @@ if (log) log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); - // Signal the private state thread. First we should copy this is case the - // thread starts exiting since the private state thread will NULL this out - // when it exits - HostThread private_state_thread(m_private_state_thread); - if (private_state_thread.IsJoinable()) + // Signal the private state thread + if (m_private_state_thread.IsJoinable()) { TimeValue timeout_time; bool timed_out; @@ -4134,7 +4131,7 @@ { if (timed_out) { - Error error = private_state_thread.Cancel(); + Error error = m_private_state_thread.Cancel(); if (log) log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString()); } @@ -4145,7 +4142,7 @@ } thread_result_t result = NULL; - private_state_thread.Join(&result); + m_private_state_thread.Join(&result); m_private_state_thread.Reset(); } } @@ -4449,7 +4446,6 @@ if (!is_secondary_thread) m_public_run_lock.SetStopped(); m_private_state_control_wait.SetValue (true, eBroadcastAlways); - m_private_state_thread.Reset(); return NULL; }
Index: source/Target/Process.cpp =================================================================== --- source/Target/Process.cpp +++ source/Target/Process.cpp @@ -4112,11 +4112,8 @@ if (log) log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); - // Signal the private state thread. First we should copy this is case the - // thread starts exiting since the private state thread will NULL this out - // when it exits - HostThread private_state_thread(m_private_state_thread); - if (private_state_thread.IsJoinable()) + // Signal the private state thread + if (m_private_state_thread.IsJoinable()) { TimeValue timeout_time; bool timed_out; @@ -4134,7 +4131,7 @@ { if (timed_out) { - Error error = private_state_thread.Cancel(); + Error error = m_private_state_thread.Cancel(); if (log) log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString()); } @@ -4145,7 +4142,7 @@ } thread_result_t result = NULL; - private_state_thread.Join(&result); + m_private_state_thread.Join(&result); m_private_state_thread.Reset(); } } @@ -4449,7 +4446,6 @@ if (!is_secondary_thread) m_public_run_lock.SetStopped(); m_private_state_control_wait.SetValue (true, eBroadcastAlways); - m_private_state_thread.Reset(); return NULL; }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits