[Lldb-commits] [lldb] r276795 - Check both private & public states to decide if you need to halt before killing.

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Wed Jul 27 05:09:10 PDT 2016


This fix is going to be flaky: Since the private state can flip back
and forth between running and stopped and there's no sychronization
between the private state thread and this code, you're going to get
unpredictable behavior depending on the exact moment you call
Destroy().

I assume the other thread is stuck in RunThreadPlan(), which does not
update the public state and that's why this does not fire. If that's
the case, we should check whether RunThreadPlan is active instead of
relying on the private state.

pl

On 26 July 2016 at 20:47, Jim Ingham via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
> Author: jingham
> Date: Tue Jul 26 14:47:45 2016
> New Revision: 276795
>
> URL: http://llvm.org/viewvc/llvm-project?rev=276795&view=rev
> Log:
> Check both private & public states to decide if you need to halt before killing.
>
> We were just checking the public state, but that meant if you were hung in a long
> running hand-called function, we wouldn't know to interrupt the process, and we would
> not succeed in killing it.
>
> <rdar://problem/24805082>
>
> 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=276795&r1=276794&r2=276795&view=diff
> ==============================================================================
> --- lldb/trunk/source/Target/Process.cpp (original)
> +++ lldb/trunk/source/Target/Process.cpp Tue Jul 26 14:47:45 2016
> @@ -3634,7 +3634,10 @@ Error
>  Process::StopForDestroyOrDetach(lldb::EventSP &exit_event_sp)
>  {
>      Error error;
> -    if (m_public_state.GetValue() == eStateRunning)
> +
> +    // Check both the public & private states here.  If we're hung evaluating an expression, for instance, then
> +    // the public state will be stopped, but we still need to interrupt.
> +    if (m_public_state.GetValue() == eStateRunning || m_private_state.GetValue() == eStateRunning)
>      {
>          Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
>          if (log)
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list