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