124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlan.cpp ------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
18745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Core/Debugger.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
215205f0b6585a127acc6ed210021abb6091220a89Greg Clayton#include "lldb/Target/RegisterContext.h"
225205f0b6585a127acc6ed210021abb6091220a89Greg Clayton#include "lldb/Target/Thread.h"
23745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Process.h"
24745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham#include "lldb/Target/Target.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlan constructor
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
325a47e8bcc7277dc3683f2af2aeb9717184e8360cJim InghamThreadPlan::ThreadPlan(ThreadPlanKind kind, const char *name, Thread &thread, Vote stop_vote, Vote run_vote) :
3336a08102b10e39274b291e03a959016ff017694aBenjamin Kramer    m_thread (thread),
3436a08102b10e39274b291e03a959016ff017694aBenjamin Kramer    m_stop_vote (stop_vote),
3536a08102b10e39274b291e03a959016ff017694aBenjamin Kramer    m_run_vote (run_vote),
365a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham    m_kind (kind),
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (name),
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_plan_complete_mutex (Mutex::eMutexTypeRecursive),
397c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    m_cached_plan_explains_stop (eLazyBoolCalculate),
4036a08102b10e39274b291e03a959016ff017694aBenjamin Kramer    m_plan_complete (false),
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_plan_private (false),
4288e3de205708f14431559072ca258899b5ac31ccJim Ingham    m_okay_to_discard (true),
43707b7a858ce66b15d01177d4a38ff1ccde44f43cJim Ingham    m_is_master_plan (false),
44707b7a858ce66b15d01177d4a38ff1ccde44f43cJim Ingham    m_plan_succeeded(true)
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetID (GetNextID());
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::~ThreadPlan()
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
577c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamThreadPlan::PlanExplainsStop (Event *event_ptr)
587c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham{
597c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    if (m_cached_plan_explains_stop == eLazyBoolCalculate)
607c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    {
617c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham        bool actual_value = DoPlanExplainsStop(event_ptr);
627c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham        m_cached_plan_explains_stop = actual_value ? eLazyBoolYes : eLazyBoolNo;
637c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham        return actual_value;
647c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    }
657c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    else
667c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    {
677c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham        return m_cached_plan_explains_stop == eLazyBoolYes;
687c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    }
697c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham}
707c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham
717c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Inghambool
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::IsPlanComplete ()
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    Mutex::Locker locker(m_plan_complete_mutex);
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_plan_complete;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
79707b7a858ce66b15d01177d4a38ff1ccde44f43cJim InghamThreadPlan::SetPlanComplete (bool success)
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    Mutex::Locker locker(m_plan_complete_mutex);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_plan_complete = true;
83707b7a858ce66b15d01177d4a38ff1ccde44f43cJim Ingham    m_plan_succeeded = success;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::MischiefManaged ()
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    Mutex::Locker locker(m_plan_complete_mutex);
90038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    // Mark the plan is complete, but don't override the success flag.
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_plan_complete = true;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVote
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::ShouldReportStop (Event *event_ptr)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
995205f0b6585a127acc6ed210021abb6091220a89Greg Clayton
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_stop_vote == eVoteNoOpinion)
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadPlan *prev_plan = GetPreviousPlan ();
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (prev_plan)
1045205f0b6585a127acc6ed210021abb6091220a89Greg Clayton        {
1055205f0b6585a127acc6ed210021abb6091220a89Greg Clayton            Vote prev_vote = prev_plan->ShouldReportStop (event_ptr);
1065205f0b6585a127acc6ed210021abb6091220a89Greg Clayton            if (log)
107441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                log->Printf ("ThreadPlan::ShouldReportStop() returning previous thread plan vote: %s",
108441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                             GetVoteAsCString (prev_vote));
1095205f0b6585a127acc6ed210021abb6091220a89Greg Clayton            return prev_vote;
1105205f0b6585a127acc6ed210021abb6091220a89Greg Clayton        }
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1125205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    if (log)
113f04d661d50bdf32a64f8fc5f84c7fcda72d4cd5aGreg Clayton        log->Printf ("ThreadPlan::ShouldReportStop() returning vote: %s", GetVoteAsCString (m_stop_vote));
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_stop_vote;
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerVote
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::ShouldReportRun (Event *event_ptr)
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_run_vote == eVoteNoOpinion)
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadPlan *prev_plan = GetPreviousPlan ();
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (prev_plan)
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return prev_plan->ShouldReportRun (event_ptr);
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_run_vote;
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::StopOthers ()
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *prev_plan;
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    prev_plan = GetPreviousPlan ();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (prev_plan == NULL)
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return prev_plan->StopOthers();
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140360f53f3c216ee4fb433da0a367168785328a856Jim Inghamvoid
141360f53f3c216ee4fb433da0a367168785328a856Jim InghamThreadPlan::SetStopOthers (bool new_value)
142360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{
143360f53f3c216ee4fb433da0a367168785328a856Jim Ingham	// SetStopOthers doesn't work up the hierarchy.  You have to set the
144360f53f3c216ee4fb433da0a367168785328a856Jim Ingham    // explicit ThreadPlan you want to affect.
145360f53f3c216ee4fb433da0a367168785328a856Jim Ingham}
146360f53f3c216ee4fb433da0a367168785328a856Jim Ingham
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::WillResume (StateType resume_state, bool current_plan)
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1507c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    m_cached_plan_explains_stop = eLazyBoolCalculate;
1517c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (current_plan)
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
154952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
1575205f0b6585a127acc6ed210021abb6091220a89Greg Clayton        {
15808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton            RegisterContext *reg_ctx = m_thread.GetRegisterContext().get();
1595205f0b6585a127acc6ed210021abb6091220a89Greg Clayton            addr_t pc = reg_ctx->GetPC();
1605205f0b6585a127acc6ed210021abb6091220a89Greg Clayton            addr_t sp = reg_ctx->GetSP();
1615205f0b6585a127acc6ed210021abb6091220a89Greg Clayton            addr_t fp = reg_ctx->GetFP();
162c4353f292a6a586cbf3e6e7df83804185579eda5Jim Ingham            log->Printf("%s Thread #%u (0x%p): tid = 0x%4.4" PRIx64 ", pc = 0x%8.8" PRIx64 ", sp = 0x%8.8" PRIx64 ", fp = 0x%8.8" PRIx64 ", "
163441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                        "plan = '%s', state = %s, stop others = %d",
164f04d661d50bdf32a64f8fc5f84c7fcda72d4cd5aGreg Clayton                        __FUNCTION__,
165c4353f292a6a586cbf3e6e7df83804185579eda5Jim Ingham                        m_thread.GetIndexID(),
166c4353f292a6a586cbf3e6e7df83804185579eda5Jim Ingham                        &m_thread,
1675205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        m_thread.GetID(),
1685205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        (uint64_t)pc,
1695205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        (uint64_t)sp,
1705205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        (uint64_t)fp,
1715205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        m_name.c_str(),
1725205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        StateAsCString(resume_state),
1735205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                        StopOthers());
1745205f0b6585a127acc6ed210021abb6091220a89Greg Clayton        }
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1767c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    return DoWillResume (resume_state, current_plan);
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::user_id_t
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::GetNextID()
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static uint32_t g_nextPlanID = 0;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ++g_nextPlanID;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::DidPush()
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::WillPop()
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlan::OkayToDiscard()
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!IsMasterPlan())
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_okay_to_discard;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Inghamlldb::StateType
206745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlan::RunState ()
207745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham{
208745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    if (m_tracer_sp && m_tracer_sp->TracingEnabled() && m_tracer_sp->SingleStepEnabled())
209745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return eStateStepping;
210745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    else
211745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return GetPlanRunState();
212745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham}
213e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
214e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton//----------------------------------------------------------------------
215e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton// ThreadPlanNull
216e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton//----------------------------------------------------------------------
217e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
218e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::ThreadPlanNull (Thread &thread) :
219e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    ThreadPlan (ThreadPlan::eKindNull,
220e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                "Null Thread Plan",
221e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                thread,
222e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                eVoteNoOpinion,
223e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                eVoteNoOpinion)
224e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
225e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
226e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
227e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::~ThreadPlanNull ()
228e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
229e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
230e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
231e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonvoid
232e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::GetDescription (Stream *s,
233e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                                lldb::DescriptionLevel level)
234e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
235e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    s->PutCString("Null thread plan - thread has been destroyed.");
236e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
237e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
238e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonbool
239e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::ValidatePlan (Stream *error)
240e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
241e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
2423160832f026e60e832da55f90993a40ad132e360Michael Sartain    fprintf(stderr, "error: %s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
243e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            __PRETTY_FUNCTION__,
244e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetID(),
245e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetProtocolID());
246e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#else
247e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
248e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    if (log)
2493160832f026e60e832da55f90993a40ad132e360Michael Sartain        log->Error("%s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
250e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    __PRETTY_FUNCTION__,
251e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    m_thread.GetID(),
252e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    m_thread.GetProtocolID());
253e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#endif
254e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    return true;
255e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
256e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
257e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonbool
258e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::ShouldStop (Event *event_ptr)
259e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
260e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
2613160832f026e60e832da55f90993a40ad132e360Michael Sartain    fprintf(stderr, "error: %s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
262e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            __PRETTY_FUNCTION__,
263e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetID(),
264e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetProtocolID());
265e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#else
266e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
267e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    if (log)
2683160832f026e60e832da55f90993a40ad132e360Michael Sartain        log->Error("%s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
269e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    __PRETTY_FUNCTION__,
270e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    m_thread.GetID(),
271e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    m_thread.GetProtocolID());
272e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#endif
273e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    return true;
274e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
275e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
276e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonbool
277e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::WillStop ()
278e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
279e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
2803160832f026e60e832da55f90993a40ad132e360Michael Sartain    fprintf(stderr, "error: %s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
281e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            __PRETTY_FUNCTION__,
282e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetID(),
283e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetProtocolID());
284e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#else
285e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
286e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    if (log)
2873160832f026e60e832da55f90993a40ad132e360Michael Sartain        log->Error("%s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
288e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    __PRETTY_FUNCTION__,
289e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    m_thread.GetID(),
290e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                    m_thread.GetProtocolID());
291e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#endif
292e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    return true;
293e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
294e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
295e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonbool
296e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::DoPlanExplainsStop (Event *event_ptr)
297e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
298e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
2993160832f026e60e832da55f90993a40ad132e360Michael Sartain    fprintf(stderr, "error: %s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
300e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            __PRETTY_FUNCTION__,
301e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetID(),
302e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetProtocolID());
303e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#else
304e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
305e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    if (log)
3063160832f026e60e832da55f90993a40ad132e360Michael Sartain        log->Error("%s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
307e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   __PRETTY_FUNCTION__,
308e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   m_thread.GetID(),
309e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   m_thread.GetProtocolID());
310e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#endif
311e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    return true;
312e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
313e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
314e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton// The null plan is never done.
315e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonbool
316e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::MischiefManaged ()
317e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
318e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    // The null plan is never done.
319e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
3203160832f026e60e832da55f90993a40ad132e360Michael Sartain    fprintf(stderr, "error: %s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
321e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            __PRETTY_FUNCTION__,
322e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetID(),
323e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetProtocolID());
324e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#else
325e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
326e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    if (log)
3273160832f026e60e832da55f90993a40ad132e360Michael Sartain        log->Error("%s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
328e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   __PRETTY_FUNCTION__,
329e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   m_thread.GetID(),
330e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   m_thread.GetProtocolID());
331e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#endif
332e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    return false;
333e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
334e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton
335e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Claytonlldb::StateType
336e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg ClaytonThreadPlanNull::GetPlanRunState ()
337e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton{
338e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    // Not sure what to return here.  This is a dead thread.
339e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
3403160832f026e60e832da55f90993a40ad132e360Michael Sartain    fprintf(stderr, "error: %s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
341e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            __PRETTY_FUNCTION__,
342e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetID(),
343e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton            m_thread.GetProtocolID());
344e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#else
345e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
346e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    if (log)
3473160832f026e60e832da55f90993a40ad132e360Michael Sartain        log->Error("%s called on thread that has been destroyed (tid = 0x%" PRIx64 ", ptid = 0x%" PRIx64 ")",
348e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   __PRETTY_FUNCTION__,
349e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   m_thread.GetID(),
350e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton                   m_thread.GetProtocolID());
351e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton#endif
352e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton    return eStateRunning;
353e4923ddaa18bf003e339e6ab33bfd137a632fc0fGreg Clayton}
354