15e8dce4dSJason Molenda //===-- SBQueueItem.cpp -----------------------------------------*- C++ -*-===// 25e8dce4dSJason Molenda // 35e8dce4dSJason Molenda // The LLVM Compiler Infrastructure 45e8dce4dSJason Molenda // 55e8dce4dSJason Molenda // This file is distributed under the University of Illinois Open Source 65e8dce4dSJason Molenda // License. See LICENSE.TXT for details. 75e8dce4dSJason Molenda // 85e8dce4dSJason Molenda //===----------------------------------------------------------------------===// 95e8dce4dSJason Molenda 105e8dce4dSJason Molenda #include "lldb/lldb-python.h" 115e8dce4dSJason Molenda #include "lldb/lldb-forward.h" 125e8dce4dSJason Molenda 135e8dce4dSJason Molenda #include "lldb/API/SBAddress.h" 145e8dce4dSJason Molenda #include "lldb/API/SBQueueItem.h" 155e8dce4dSJason Molenda #include "lldb/API/SBThread.h" 165e8dce4dSJason Molenda #include "lldb/Core/Address.h" 17*ac605f4aSJason Molenda #include "lldb/Core/Log.h" 18a8ff543cSJason Molenda #include "lldb/Target/Process.h" 195e8dce4dSJason Molenda #include "lldb/Target/QueueItem.h" 202fd83355SJason Molenda #include "lldb/Target/Thread.h" 215e8dce4dSJason Molenda 225e8dce4dSJason Molenda using namespace lldb; 235e8dce4dSJason Molenda using namespace lldb_private; 245e8dce4dSJason Molenda 255e8dce4dSJason Molenda //---------------------------------------------------------------------- 265e8dce4dSJason Molenda // Constructors 275e8dce4dSJason Molenda //---------------------------------------------------------------------- 285e8dce4dSJason Molenda SBQueueItem::SBQueueItem () : 295e8dce4dSJason Molenda m_queue_item_sp() 305e8dce4dSJason Molenda { 315e8dce4dSJason Molenda } 325e8dce4dSJason Molenda 335e8dce4dSJason Molenda SBQueueItem::SBQueueItem (const QueueItemSP& queue_item_sp) : 345e8dce4dSJason Molenda m_queue_item_sp (queue_item_sp) 355e8dce4dSJason Molenda { 365e8dce4dSJason Molenda } 375e8dce4dSJason Molenda 385e8dce4dSJason Molenda //---------------------------------------------------------------------- 395e8dce4dSJason Molenda // Destructor 405e8dce4dSJason Molenda //---------------------------------------------------------------------- 415e8dce4dSJason Molenda SBQueueItem::~SBQueueItem() 425e8dce4dSJason Molenda { 435e8dce4dSJason Molenda m_queue_item_sp.reset(); 445e8dce4dSJason Molenda } 455e8dce4dSJason Molenda 465e8dce4dSJason Molenda bool 475e8dce4dSJason Molenda SBQueueItem::IsValid() const 485e8dce4dSJason Molenda { 49*ac605f4aSJason Molenda bool is_valid = m_queue_item_sp.get() != NULL; 50*ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 51*ac605f4aSJason Molenda if (log) 52*ac605f4aSJason Molenda log->Printf("SBQueueItem(%p)::IsValid() == %s", m_queue_item_sp.get(), is_valid ? "true" : "false"); 53*ac605f4aSJason Molenda return is_valid; 545e8dce4dSJason Molenda } 555e8dce4dSJason Molenda 565e8dce4dSJason Molenda 575e8dce4dSJason Molenda void 585e8dce4dSJason Molenda SBQueueItem::Clear () 595e8dce4dSJason Molenda { 60*ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61*ac605f4aSJason Molenda if (log) 62*ac605f4aSJason Molenda log->Printf("SBQueueItem(%p)::Clear()", m_queue_item_sp.get()); 635e8dce4dSJason Molenda m_queue_item_sp.reset(); 645e8dce4dSJason Molenda } 655e8dce4dSJason Molenda 665e8dce4dSJason Molenda 675e8dce4dSJason Molenda void 685e8dce4dSJason Molenda SBQueueItem::SetQueueItem (const QueueItemSP& queue_item_sp) 695e8dce4dSJason Molenda { 705e8dce4dSJason Molenda m_queue_item_sp = queue_item_sp; 715e8dce4dSJason Molenda } 725e8dce4dSJason Molenda 735e8dce4dSJason Molenda 745e8dce4dSJason Molenda lldb::QueueItemKind 755e8dce4dSJason Molenda SBQueueItem::GetKind () const 765e8dce4dSJason Molenda { 775e8dce4dSJason Molenda QueueItemKind result = eQueueItemKindUnknown; 78*ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 795e8dce4dSJason Molenda if (m_queue_item_sp) 805e8dce4dSJason Molenda { 815e8dce4dSJason Molenda result = m_queue_item_sp->GetKind (); 825e8dce4dSJason Molenda } 83*ac605f4aSJason Molenda if (log) 84*ac605f4aSJason Molenda log->Printf("SBQueueItem(%p)::GetKind() == %d", m_queue_item_sp.get(), (int) result); 855e8dce4dSJason Molenda return result; 865e8dce4dSJason Molenda } 875e8dce4dSJason Molenda 885e8dce4dSJason Molenda void 895e8dce4dSJason Molenda SBQueueItem::SetKind (lldb::QueueItemKind kind) 905e8dce4dSJason Molenda { 915e8dce4dSJason Molenda if (m_queue_item_sp) 925e8dce4dSJason Molenda { 935e8dce4dSJason Molenda m_queue_item_sp->SetKind (kind); 945e8dce4dSJason Molenda } 955e8dce4dSJason Molenda } 965e8dce4dSJason Molenda 975e8dce4dSJason Molenda SBAddress 985e8dce4dSJason Molenda SBQueueItem::GetAddress () const 995e8dce4dSJason Molenda { 1005e8dce4dSJason Molenda SBAddress result; 101*ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1025e8dce4dSJason Molenda if (m_queue_item_sp) 1035e8dce4dSJason Molenda { 1045e8dce4dSJason Molenda result.SetAddress (&m_queue_item_sp->GetAddress()); 1055e8dce4dSJason Molenda } 106*ac605f4aSJason Molenda if (log) 107*ac605f4aSJason Molenda { 108*ac605f4aSJason Molenda StreamString sstr; 109*ac605f4aSJason Molenda const Address *addr = result.get(); 110*ac605f4aSJason Molenda if (addr) 111*ac605f4aSJason Molenda addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 112*ac605f4aSJason Molenda log->Printf ("SBQueueItem(%p)::GetAddress() == SBAddress(%p): %s", 113*ac605f4aSJason Molenda m_queue_item_sp.get(), result.get(), sstr.GetData()); 114*ac605f4aSJason Molenda } 1155e8dce4dSJason Molenda return result; 1165e8dce4dSJason Molenda } 1175e8dce4dSJason Molenda 1185e8dce4dSJason Molenda void 1195e8dce4dSJason Molenda SBQueueItem::SetAddress (SBAddress addr) 1205e8dce4dSJason Molenda { 1215e8dce4dSJason Molenda if (m_queue_item_sp) 1225e8dce4dSJason Molenda { 1235e8dce4dSJason Molenda m_queue_item_sp->SetAddress (addr.ref()); 1245e8dce4dSJason Molenda } 1255e8dce4dSJason Molenda } 1265e8dce4dSJason Molenda 1275e8dce4dSJason Molenda SBThread 1285e8dce4dSJason Molenda SBQueueItem::GetExtendedBacktraceThread (const char *type) 1295e8dce4dSJason Molenda { 1305e8dce4dSJason Molenda SBThread result; 131*ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1325e8dce4dSJason Molenda if (m_queue_item_sp) 1335e8dce4dSJason Molenda { 134a8ff543cSJason Molenda ProcessSP process_sp = m_queue_item_sp->GetProcessSP(); 135a8ff543cSJason Molenda Process::StopLocker stop_locker; 136a8ff543cSJason Molenda if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) 137a8ff543cSJason Molenda { 1385e8dce4dSJason Molenda ThreadSP thread_sp; 1395e8dce4dSJason Molenda ConstString type_const (type); 1405e8dce4dSJason Molenda thread_sp = m_queue_item_sp->GetExtendedBacktraceThread (type_const); 1415e8dce4dSJason Molenda if (thread_sp) 1425e8dce4dSJason Molenda { 143a8ff543cSJason Molenda // Save this in the Process' ExtendedThreadList so a strong pointer retains the 144a8ff543cSJason Molenda // object 145a8ff543cSJason Molenda process_sp->GetExtendedThreadList().AddThread (thread_sp); 1465e8dce4dSJason Molenda result.SetThread (thread_sp); 147*ac605f4aSJason Molenda if (log) 148*ac605f4aSJason Molenda { 149*ac605f4aSJason Molenda const char *queue_name = thread_sp->GetQueueName(); 150*ac605f4aSJason Molenda if (queue_name == NULL) 151*ac605f4aSJason Molenda queue_name = ""; 152*ac605f4aSJason Molenda log->Printf ("SBQueueItem(%p)::GetExtendedBacktraceThread() = new extended Thread created (%p) with queue_id 0x%" PRIx64 " queue name '%s'", m_queue_item_sp.get(), thread_sp.get(), (uint64_t) thread_sp->GetQueueID(), queue_name); 153*ac605f4aSJason Molenda } 1545e8dce4dSJason Molenda } 1555e8dce4dSJason Molenda } 156a8ff543cSJason Molenda } 1575e8dce4dSJason Molenda return result; 1585e8dce4dSJason Molenda } 159