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" 17ac605f4aSJason 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 { 49ac605f4aSJason Molenda bool is_valid = m_queue_item_sp.get() != NULL; 50ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 51ac605f4aSJason Molenda if (log) 52*324a1036SSaleem Abdulrasool log->Printf("SBQueueItem(%p)::IsValid() == %s", 53*324a1036SSaleem Abdulrasool static_cast<void*>(m_queue_item_sp.get()), 54*324a1036SSaleem Abdulrasool is_valid ? "true" : "false"); 55ac605f4aSJason Molenda return is_valid; 565e8dce4dSJason Molenda } 575e8dce4dSJason Molenda 585e8dce4dSJason Molenda 595e8dce4dSJason Molenda void 605e8dce4dSJason Molenda SBQueueItem::Clear () 615e8dce4dSJason Molenda { 62ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 63ac605f4aSJason Molenda if (log) 64*324a1036SSaleem Abdulrasool log->Printf("SBQueueItem(%p)::Clear()", 65*324a1036SSaleem Abdulrasool static_cast<void*>(m_queue_item_sp.get())); 665e8dce4dSJason Molenda m_queue_item_sp.reset(); 675e8dce4dSJason Molenda } 685e8dce4dSJason Molenda 695e8dce4dSJason Molenda 705e8dce4dSJason Molenda void 715e8dce4dSJason Molenda SBQueueItem::SetQueueItem (const QueueItemSP& queue_item_sp) 725e8dce4dSJason Molenda { 735e8dce4dSJason Molenda m_queue_item_sp = queue_item_sp; 745e8dce4dSJason Molenda } 755e8dce4dSJason Molenda 765e8dce4dSJason Molenda 775e8dce4dSJason Molenda lldb::QueueItemKind 785e8dce4dSJason Molenda SBQueueItem::GetKind () const 795e8dce4dSJason Molenda { 805e8dce4dSJason Molenda QueueItemKind result = eQueueItemKindUnknown; 81ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 825e8dce4dSJason Molenda if (m_queue_item_sp) 835e8dce4dSJason Molenda { 845e8dce4dSJason Molenda result = m_queue_item_sp->GetKind (); 855e8dce4dSJason Molenda } 86ac605f4aSJason Molenda if (log) 87*324a1036SSaleem Abdulrasool log->Printf("SBQueueItem(%p)::GetKind() == %d", 88*324a1036SSaleem Abdulrasool static_cast<void*>(m_queue_item_sp.get()), 89*324a1036SSaleem Abdulrasool static_cast<int>(result)); 905e8dce4dSJason Molenda return result; 915e8dce4dSJason Molenda } 925e8dce4dSJason Molenda 935e8dce4dSJason Molenda void 945e8dce4dSJason Molenda SBQueueItem::SetKind (lldb::QueueItemKind kind) 955e8dce4dSJason Molenda { 965e8dce4dSJason Molenda if (m_queue_item_sp) 975e8dce4dSJason Molenda { 985e8dce4dSJason Molenda m_queue_item_sp->SetKind (kind); 995e8dce4dSJason Molenda } 1005e8dce4dSJason Molenda } 1015e8dce4dSJason Molenda 1025e8dce4dSJason Molenda SBAddress 1035e8dce4dSJason Molenda SBQueueItem::GetAddress () const 1045e8dce4dSJason Molenda { 1055e8dce4dSJason Molenda SBAddress result; 106ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1075e8dce4dSJason Molenda if (m_queue_item_sp) 1085e8dce4dSJason Molenda { 1095e8dce4dSJason Molenda result.SetAddress (&m_queue_item_sp->GetAddress()); 1105e8dce4dSJason Molenda } 111ac605f4aSJason Molenda if (log) 112ac605f4aSJason Molenda { 113ac605f4aSJason Molenda StreamString sstr; 114ac605f4aSJason Molenda const Address *addr = result.get(); 115ac605f4aSJason Molenda if (addr) 116ac605f4aSJason Molenda addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 117ac605f4aSJason Molenda log->Printf ("SBQueueItem(%p)::GetAddress() == SBAddress(%p): %s", 118*324a1036SSaleem Abdulrasool static_cast<void*>(m_queue_item_sp.get()), 119*324a1036SSaleem Abdulrasool static_cast<void*>(result.get()), sstr.GetData()); 120ac605f4aSJason Molenda } 1215e8dce4dSJason Molenda return result; 1225e8dce4dSJason Molenda } 1235e8dce4dSJason Molenda 1245e8dce4dSJason Molenda void 1255e8dce4dSJason Molenda SBQueueItem::SetAddress (SBAddress addr) 1265e8dce4dSJason Molenda { 1275e8dce4dSJason Molenda if (m_queue_item_sp) 1285e8dce4dSJason Molenda { 1295e8dce4dSJason Molenda m_queue_item_sp->SetAddress (addr.ref()); 1305e8dce4dSJason Molenda } 1315e8dce4dSJason Molenda } 1325e8dce4dSJason Molenda 1335e8dce4dSJason Molenda SBThread 1345e8dce4dSJason Molenda SBQueueItem::GetExtendedBacktraceThread (const char *type) 1355e8dce4dSJason Molenda { 1365e8dce4dSJason Molenda SBThread result; 137ac605f4aSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1385e8dce4dSJason Molenda if (m_queue_item_sp) 1395e8dce4dSJason Molenda { 140a8ff543cSJason Molenda ProcessSP process_sp = m_queue_item_sp->GetProcessSP(); 141a8ff543cSJason Molenda Process::StopLocker stop_locker; 142a8ff543cSJason Molenda if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) 143a8ff543cSJason Molenda { 1445e8dce4dSJason Molenda ThreadSP thread_sp; 1455e8dce4dSJason Molenda ConstString type_const (type); 1465e8dce4dSJason Molenda thread_sp = m_queue_item_sp->GetExtendedBacktraceThread (type_const); 1475e8dce4dSJason Molenda if (thread_sp) 1485e8dce4dSJason Molenda { 149a8ff543cSJason Molenda // Save this in the Process' ExtendedThreadList so a strong pointer retains the 150a8ff543cSJason Molenda // object 151a8ff543cSJason Molenda process_sp->GetExtendedThreadList().AddThread (thread_sp); 1525e8dce4dSJason Molenda result.SetThread (thread_sp); 153ac605f4aSJason Molenda if (log) 154ac605f4aSJason Molenda { 155ac605f4aSJason Molenda const char *queue_name = thread_sp->GetQueueName(); 156ac605f4aSJason Molenda if (queue_name == NULL) 157ac605f4aSJason Molenda queue_name = ""; 158*324a1036SSaleem Abdulrasool log->Printf ("SBQueueItem(%p)::GetExtendedBacktraceThread() = new extended Thread created (%p) with queue_id 0x%" PRIx64 " queue name '%s'", 159*324a1036SSaleem Abdulrasool static_cast<void*>(m_queue_item_sp.get()), 160*324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), 161*324a1036SSaleem Abdulrasool static_cast<uint64_t>(thread_sp->GetQueueID()), 162*324a1036SSaleem Abdulrasool queue_name); 163ac605f4aSJason Molenda } 1645e8dce4dSJason Molenda } 1655e8dce4dSJason Molenda } 166a8ff543cSJason Molenda } 1675e8dce4dSJason Molenda return result; 1685e8dce4dSJason Molenda } 169