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