blob: 9d4032a29e6ffe3a37b53c6b28b2a2d8d672abbe [file] [log] [blame]
Jason Molenda5e8dce42013-12-13 00:29:16 +00001//===-- 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
Eugene Zelenkod70a6e72016-02-18 18:52:47 +000010// C Includes
11// C++ Includes
12// Other libraries and framework includes
13// Project includes
Jason Molenda5e8dce42013-12-13 00:29:16 +000014#include "lldb/Target/Process.h"
15#include "lldb/Target/Queue.h"
16#include "lldb/Target/QueueList.h"
17#include "lldb/Target/Thread.h"
Jason Molenda2fd83352014-02-05 05:44:54 +000018#include "lldb/Target/SystemRuntime.h"
Jason Molenda5e8dce42013-12-13 00:29:16 +000019
20using namespace lldb;
21using namespace lldb_private;
22
23Queue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) :
Jason Molendab97f44d2013-12-18 00:58:23 +000024 m_process_wp (),
Jason Molenda5e8dce42013-12-13 00:29:16 +000025 m_queue_id (queue_id),
Jason Molenda4a5ec882013-12-19 00:09:13 +000026 m_queue_name (),
Jason Molenda2fd83352014-02-05 05:44:54 +000027 m_running_work_items_count(0),
28 m_pending_work_items_count(0),
29 m_pending_items(),
Jason Molendaaac16e02014-03-13 02:54:54 +000030 m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS),
31 m_kind (eQueueKindUnknown)
Jason Molenda5e8dce42013-12-13 00:29:16 +000032{
Jason Molenda4a5ec882013-12-19 00:09:13 +000033 if (queue_name)
34 m_queue_name = queue_name;
35
Jason Molendab97f44d2013-12-18 00:58:23 +000036 m_process_wp = process_sp;
Jason Molenda5e8dce42013-12-13 00:29:16 +000037}
38
Eugene Zelenkod70a6e72016-02-18 18:52:47 +000039Queue::~Queue() = default;
Jason Molenda5e8dce42013-12-13 00:29:16 +000040
41queue_id_t
42Queue::GetID ()
43{
44 return m_queue_id;
45}
46
47const char *
48Queue::GetName ()
49{
Eugene Zelenkod70a6e72016-02-18 18:52:47 +000050 return (m_queue_name.empty() ? nullptr : m_queue_name.c_str());
Jason Molenda5e8dce42013-12-13 00:29:16 +000051}
52
53uint32_t
54Queue::GetIndexID ()
55{
Jason Molenda2fd83352014-02-05 05:44:54 +000056 return m_queue_id;
Jason Molenda5e8dce42013-12-13 00:29:16 +000057}
58
59std::vector<lldb::ThreadSP>
60Queue::GetThreads ()
61{
62 std::vector<ThreadSP> result;
63 ProcessSP process_sp = m_process_wp.lock();
Eugene Zelenkod70a6e72016-02-18 18:52:47 +000064 if (process_sp)
Jason Molenda5e8dce42013-12-13 00:29:16 +000065 {
66 for (ThreadSP thread_sp : process_sp->Threads())
67 {
68 if (thread_sp->GetQueueID() == m_queue_id)
69 {
70 result.push_back (thread_sp);
71 }
72 }
73 }
74 return result;
75}
Jason Molenda2fd83352014-02-05 05:44:54 +000076
77void
78Queue::SetNumRunningWorkItems (uint32_t count)
79{
80 m_running_work_items_count = count;
81}
82
83uint32_t
84Queue::GetNumRunningWorkItems () const
85{
86 return m_running_work_items_count;
87}
88
Jason Molenda2fd83352014-02-05 05:44:54 +000089void
90Queue::SetNumPendingWorkItems (uint32_t count)
91{
92 m_pending_work_items_count = count;
93}
94
95uint32_t
96Queue::GetNumPendingWorkItems () const
97{
98 return m_pending_work_items_count;
99}
100
101void
102Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr)
103{
104 m_dispatch_queue_t_addr = dispatch_queue_t_addr;
105}
106
107addr_t
108Queue::GetLibdispatchQueueAddress () const
109{
110 return m_dispatch_queue_t_addr;
111}
112
Jason Molenda2fd83352014-02-05 05:44:54 +0000113const std::vector<lldb::QueueItemSP> &
114Queue::GetPendingItems ()
115{
Eugene Zelenkod70a6e72016-02-18 18:52:47 +0000116 if (m_pending_items.empty())
Jason Molenda2fd83352014-02-05 05:44:54 +0000117 {
118 ProcessSP process_sp = m_process_wp.lock();
119 if (process_sp && process_sp->GetSystemRuntime())
120 {
121 process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this);
122 }
123 }
124 return m_pending_items;
125}
Jason Molendaaac16e02014-03-13 02:54:54 +0000126
127lldb::QueueKind
128Queue::GetKind ()
129{
130 return m_kind;
131}
132
133void
134Queue::SetKind (lldb::QueueKind kind)
135{
136 m_kind = kind;
137}