Queue.cpp revision 276479
1//===-- Queue.cpp -----------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Target/Process.h"
11#include "lldb/Target/Queue.h"
12#include "lldb/Target/QueueList.h"
13#include "lldb/Target/Thread.h"
14#include "lldb/Target/SystemRuntime.h"
15
16using namespace lldb;
17using namespace lldb_private;
18
19Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) :
20    m_process_wp (),
21    m_queue_id (queue_id),
22    m_queue_name (),
23    m_running_work_items_count(0),
24    m_pending_work_items_count(0),
25    m_pending_items(),
26    m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS),
27    m_kind (eQueueKindUnknown)
28{
29    if (queue_name)
30        m_queue_name = queue_name;
31
32    m_process_wp = process_sp;
33}
34
35Queue::~Queue ()
36{
37}
38
39queue_id_t
40Queue::GetID ()
41{
42    return m_queue_id;
43}
44
45const char *
46Queue::GetName ()
47{
48    const char *result = NULL;
49    if (m_queue_name.size() > 0)
50        result = m_queue_name.c_str();
51    return result;
52}
53
54uint32_t
55Queue::GetIndexID ()
56{
57    return m_queue_id;
58}
59
60std::vector<lldb::ThreadSP>
61Queue::GetThreads ()
62{
63    std::vector<ThreadSP> result;
64    ProcessSP process_sp = m_process_wp.lock();
65    if (process_sp.get ())
66    {
67        for (ThreadSP thread_sp : process_sp->Threads())
68        {
69            if (thread_sp->GetQueueID() == m_queue_id)
70            {
71                result.push_back (thread_sp);
72            }
73        }
74    }
75    return result;
76}
77
78void
79Queue::SetNumRunningWorkItems (uint32_t count)
80{
81    m_running_work_items_count = count;
82}
83
84uint32_t
85Queue::GetNumRunningWorkItems () const
86{
87    return m_running_work_items_count;
88}
89
90
91void
92Queue::SetNumPendingWorkItems (uint32_t count)
93{
94    m_pending_work_items_count = count;
95}
96
97uint32_t
98Queue::GetNumPendingWorkItems () const
99{
100    return m_pending_work_items_count;
101}
102
103void
104Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr)
105{
106    m_dispatch_queue_t_addr = dispatch_queue_t_addr;
107}
108
109addr_t
110Queue::GetLibdispatchQueueAddress () const
111{
112    return m_dispatch_queue_t_addr;
113}
114
115
116const std::vector<lldb::QueueItemSP> &
117Queue::GetPendingItems ()
118{
119    if (m_pending_items.size() == 0)
120    {
121        ProcessSP process_sp = m_process_wp.lock();
122        if (process_sp && process_sp->GetSystemRuntime())
123        {
124            process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this);
125        }
126    }
127    return m_pending_items;
128}
129
130lldb::QueueKind
131Queue::GetKind ()
132{
133    return m_kind;
134}
135
136void
137Queue::SetKind (lldb::QueueKind kind)
138{
139    m_kind = kind;
140}
141