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