Queue.cpp revision 262187
1877Sache//===-- Queue.cpp -----------------------------------------------*- C++ -*-===//
21019Sache//
31019Sache//                     The LLVM Compiler Infrastructure
4877Sache//
51019Sache// This file is distributed under the University of Illinois Open Source
61019Sache// License. See LICENSE.TXT for details.
71019Sache//
81019Sache//===----------------------------------------------------------------------===//
91019Sache
101019Sache#include "lldb/Target/Process.h"
111019Sache#include "lldb/Target/Queue.h"
121019Sache#include "lldb/Target/QueueList.h"
13877Sache#include "lldb/Target/Thread.h"
141019Sache#include "lldb/Target/SystemRuntime.h"
151019Sache
161019Sacheusing namespace lldb;
171019Sacheusing namespace lldb_private;
181019Sache
191019SacheQueue::Queue (ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name) :
201019Sache    m_process_wp (),
211019Sache    m_queue_id (queue_id),
221019Sache    m_queue_name (),
231019Sache    m_running_work_items_count(0),
241019Sache    m_pending_work_items_count(0),
251817Sdg    m_pending_items(),
261817Sdg    m_dispatch_queue_t_addr(LLDB_INVALID_ADDRESS)
27877Sache{
28877Sache    if (queue_name)
29877Sache        m_queue_name = queue_name;
30877Sache
31877Sache    m_process_wp = process_sp;
32877Sache}
33877Sache
34877SacheQueue::~Queue ()
35877Sache{
36877Sache}
37877Sache
38877Sachequeue_id_t
39877SacheQueue::GetID ()
40877Sache{
41877Sache    return m_queue_id;
42877Sache}
43877Sache
44877Sacheconst char *
45877SacheQueue::GetName ()
46877Sache{
47877Sache    const char *result = NULL;
48877Sache    if (m_queue_name.size() > 0)
49877Sache        result = m_queue_name.c_str();
50877Sache    return result;
51877Sache}
52877Sache
53877Sacheuint32_t
54877SacheQueue::GetIndexID ()
55877Sache{
56877Sache    return m_queue_id;
57877Sache}
58877Sache
59877Sachestd::vector<lldb::ThreadSP>
60877SacheQueue::GetThreads ()
61877Sache{
62877Sache    std::vector<ThreadSP> result;
63877Sache    ProcessSP process_sp = m_process_wp.lock();
64877Sache    if (process_sp.get ())
65877Sache    {
66877Sache        for (ThreadSP thread_sp : process_sp->Threads())
67877Sache        {
68877Sache            if (thread_sp->GetQueueID() == m_queue_id)
69877Sache            {
70877Sache                result.push_back (thread_sp);
71877Sache            }
72877Sache        }
73877Sache    }
74877Sache    return result;
75877Sache}
76877Sache
77877Sachevoid
78877SacheQueue::SetNumRunningWorkItems (uint32_t count)
79877Sache{
80877Sache    m_running_work_items_count = count;
81877Sache}
82877Sache
83877Sacheuint32_t
84877SacheQueue::GetNumRunningWorkItems () const
85877Sache{
86877Sache    return m_running_work_items_count;
87877Sache}
88877Sache
89877Sache
90877Sachevoid
91877SacheQueue::SetNumPendingWorkItems (uint32_t count)
92877Sache{
93891Sache    m_pending_work_items_count = count;
94891Sache}
95877Sache
96877Sacheuint32_t
97877SacheQueue::GetNumPendingWorkItems () const
98877Sache{
99877Sache    return m_pending_work_items_count;
100877Sache}
101
102void
103Queue::SetLibdispatchQueueAddress (addr_t dispatch_queue_t_addr)
104{
105    m_dispatch_queue_t_addr = dispatch_queue_t_addr;
106}
107
108addr_t
109Queue::GetLibdispatchQueueAddress () const
110{
111    return m_dispatch_queue_t_addr;
112}
113
114
115const std::vector<lldb::QueueItemSP> &
116Queue::GetPendingItems ()
117{
118    if (m_pending_items.size() == 0)
119    {
120        ProcessSP process_sp = m_process_wp.lock();
121        if (process_sp && process_sp->GetSystemRuntime())
122        {
123            process_sp->GetSystemRuntime()->PopulatePendingItemsForQueue (this);
124        }
125    }
126    return m_pending_items;
127}
128