15e8dce4dSJason Molenda //===-- Queue.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/Target/Process.h"
115e8dce4dSJason Molenda #include "lldb/Target/Queue.h"
125e8dce4dSJason Molenda #include "lldb/Target/QueueList.h"
135e8dce4dSJason Molenda #include "lldb/Target/Thread.h"
14*2fd83355SJason Molenda #include "lldb/Target/SystemRuntime.h"
155e8dce4dSJason Molenda 
165e8dce4dSJason Molenda using namespace lldb;
175e8dce4dSJason Molenda using namespace lldb_private;
185e8dce4dSJason Molenda 
195e8dce4dSJason Molenda Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) :
20b97f44d9SJason Molenda     m_process_wp (),
215e8dce4dSJason Molenda     m_queue_id (queue_id),
224a5ec88fSJason Molenda     m_queue_name (),
23*2fd83355SJason Molenda     m_running_work_items_count(0),
24*2fd83355SJason Molenda     m_pending_work_items_count(0),
25*2fd83355SJason Molenda     m_pending_items(),
26*2fd83355SJason Molenda     m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS)
275e8dce4dSJason Molenda {
284a5ec88fSJason Molenda     if (queue_name)
294a5ec88fSJason Molenda         m_queue_name = queue_name;
304a5ec88fSJason Molenda 
31b97f44d9SJason Molenda     m_process_wp = process_sp;
325e8dce4dSJason Molenda }
335e8dce4dSJason Molenda 
345e8dce4dSJason Molenda Queue::~Queue ()
355e8dce4dSJason Molenda {
365e8dce4dSJason Molenda }
375e8dce4dSJason Molenda 
385e8dce4dSJason Molenda queue_id_t
395e8dce4dSJason Molenda Queue::GetID ()
405e8dce4dSJason Molenda {
415e8dce4dSJason Molenda     return m_queue_id;
425e8dce4dSJason Molenda }
435e8dce4dSJason Molenda 
445e8dce4dSJason Molenda const char *
455e8dce4dSJason Molenda Queue::GetName ()
465e8dce4dSJason Molenda {
475e8dce4dSJason Molenda     const char *result = NULL;
485e8dce4dSJason Molenda     if (m_queue_name.size() > 0)
495e8dce4dSJason Molenda         result = m_queue_name.c_str();
505e8dce4dSJason Molenda     return result;
515e8dce4dSJason Molenda }
525e8dce4dSJason Molenda 
535e8dce4dSJason Molenda uint32_t
545e8dce4dSJason Molenda Queue::GetIndexID ()
555e8dce4dSJason Molenda {
56*2fd83355SJason Molenda     return m_queue_id;
575e8dce4dSJason Molenda }
585e8dce4dSJason Molenda 
595e8dce4dSJason Molenda std::vector<lldb::ThreadSP>
605e8dce4dSJason Molenda Queue::GetThreads ()
615e8dce4dSJason Molenda {
625e8dce4dSJason Molenda     std::vector<ThreadSP> result;
635e8dce4dSJason Molenda     ProcessSP process_sp = m_process_wp.lock();
645e8dce4dSJason Molenda     if (process_sp.get ())
655e8dce4dSJason Molenda     {
665e8dce4dSJason Molenda         for (ThreadSP thread_sp : process_sp->Threads())
675e8dce4dSJason Molenda         {
685e8dce4dSJason Molenda             if (thread_sp->GetQueueID() == m_queue_id)
695e8dce4dSJason Molenda             {
705e8dce4dSJason Molenda                 result.push_back (thread_sp);
715e8dce4dSJason Molenda             }
725e8dce4dSJason Molenda         }
735e8dce4dSJason Molenda     }
745e8dce4dSJason Molenda     return result;
755e8dce4dSJason Molenda }
76*2fd83355SJason Molenda 
77*2fd83355SJason Molenda void
78*2fd83355SJason Molenda Queue::SetNumRunningWorkItems (uint32_t count)
79*2fd83355SJason Molenda {
80*2fd83355SJason Molenda     m_running_work_items_count = count;
81*2fd83355SJason Molenda }
82*2fd83355SJason Molenda 
83*2fd83355SJason Molenda uint32_t
84*2fd83355SJason Molenda Queue::GetNumRunningWorkItems () const
85*2fd83355SJason Molenda {
86*2fd83355SJason Molenda     return m_running_work_items_count;
87*2fd83355SJason Molenda }
88*2fd83355SJason Molenda 
89*2fd83355SJason Molenda 
90*2fd83355SJason Molenda void
91*2fd83355SJason Molenda Queue::SetNumPendingWorkItems (uint32_t count)
92*2fd83355SJason Molenda {
93*2fd83355SJason Molenda     m_pending_work_items_count = count;
94*2fd83355SJason Molenda }
95*2fd83355SJason Molenda 
96*2fd83355SJason Molenda uint32_t
97*2fd83355SJason Molenda Queue::GetNumPendingWorkItems () const
98*2fd83355SJason Molenda {
99*2fd83355SJason Molenda     return m_pending_work_items_count;
100*2fd83355SJason Molenda }
101*2fd83355SJason Molenda 
102*2fd83355SJason Molenda void
103*2fd83355SJason Molenda Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr)
104*2fd83355SJason Molenda {
105*2fd83355SJason Molenda     m_dispatch_queue_t_addr = dispatch_queue_t_addr;
106*2fd83355SJason Molenda }
107*2fd83355SJason Molenda 
108*2fd83355SJason Molenda addr_t
109*2fd83355SJason Molenda Queue::GetLibdispatchQueueAddress () const
110*2fd83355SJason Molenda {
111*2fd83355SJason Molenda     return m_dispatch_queue_t_addr;
112*2fd83355SJason Molenda }
113*2fd83355SJason Molenda 
114*2fd83355SJason Molenda 
115*2fd83355SJason Molenda const std::vector<lldb::QueueItemSP> &
116*2fd83355SJason Molenda Queue::GetPendingItems ()
117*2fd83355SJason Molenda {
118*2fd83355SJason Molenda     if (m_pending_items.size() == 0)
119*2fd83355SJason Molenda     {
120*2fd83355SJason Molenda         ProcessSP process_sp = m_process_wp.lock();
121*2fd83355SJason Molenda         if (process_sp && process_sp->GetSystemRuntime())
122*2fd83355SJason Molenda         {
123*2fd83355SJason Molenda             process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this);
124*2fd83355SJason Molenda         }
125*2fd83355SJason Molenda     }
126*2fd83355SJason Molenda     return m_pending_items;
127*2fd83355SJason Molenda }
128