1 //===-- Queue.h ------------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_Queue_h_
11 #define liblldb_Queue_h_
16 #include "lldb/lldb-forward.h"
17 #include "lldb/lldb-enumerations.h"
18 #include "lldb/lldb-private.h"
19 #include "lldb/Target/QueueItem.h"
22 namespace lldb_private {
24 //------------------------------------------------------------------
26 // This class represents a libdispatch aka Grand Central Dispatch
27 // queue in the process.
29 // A program using libdispatch will create queues, put work items
30 // (functions, blocks) on the queues. The system will create /
31 // reassign pthreads to execute the work items for the queues. A
32 // serial queue will be associated with a single thread (or possibly
33 // no thread, if it is not doing any work). A concurrent queue may
34 // be associated with multiple threads.
35 //------------------------------------------------------------------
39 public std::enable_shared_from_this<Queue>
43 Queue (lldb::ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name);
47 //------------------------------------------------------------------
48 /// Get the QueueID for this Queue
50 /// A 64-bit ID number that uniquely identifies a queue at this particular
51 /// stop_id. Currently the libdispatch serialnum is used for the QueueID;
52 /// it is a number that starts at 1 for each process and increments with
53 /// each queue. A serialnum is not reused for a different queue in the
54 /// lifetime of that process execution.
57 /// The QueueID for this Queue.
58 //------------------------------------------------------------------
62 //------------------------------------------------------------------
63 /// Get the name of this Queue
66 /// The name of the queue, if one is available.
67 /// A NULL pointer is returned if none is available.
68 //------------------------------------------------------------------
72 //------------------------------------------------------------------
73 /// Get the IndexID for this Queue
75 /// This is currently the same as GetID(). If it changes in the future,
76 /// it will be a small integer value (starting with 1) assigned to
77 /// each queue that is seen during a Process lifetime.
79 /// Both the GetID and GetIndexID are being retained for Queues to
80 /// maintain similar API to the Thread class, and allow for the
81 /// possibility of GetID changing to a different source in the future.
84 /// The IndexID for this queue.
85 //------------------------------------------------------------------
89 //------------------------------------------------------------------
90 /// Return the threads currently associated with this queue
92 /// Zero, one, or many threads may be executing code for a queue at
93 /// a given point in time. This call returns the list of threads
94 /// that are currently executing work for this queue.
97 /// The threads currently performing work for this queue
98 //------------------------------------------------------------------
99 std::vector<lldb::ThreadSP>
102 //------------------------------------------------------------------
103 /// Return the items that are currently enqueued
105 /// "Enqueued" means that the item has been added to the queue to
106 /// be done, but has not yet been done. When the item is going to
107 /// be processed it is "dequeued".
110 /// The vector of enqueued items for this queue
111 //------------------------------------------------------------------
112 const std::vector<lldb::QueueItemSP> &
118 return m_process_wp.lock();
121 //------------------------------------------------------------------
122 /// Get the number of work items that this queue is currently running
125 /// The number of work items currently executing. For a serial
126 /// queue, this will be 0 or 1. For a concurrent queue, this
127 /// may be any number.
128 //------------------------------------------------------------------
130 GetNumRunningWorkItems () const;
132 //------------------------------------------------------------------
133 /// Get the number of work items enqueued on this queue
136 /// The number of work items currently enqueued, waiting to
138 //------------------------------------------------------------------
140 GetNumPendingWorkItems () const;
142 //------------------------------------------------------------------
143 /// Get the dispatch_queue_t structure address for this Queue
145 /// Get the address in the inferior process' memory of this Queue's
146 /// dispatch_queue_t structure.
149 /// The address of the dispatch_queue_t structure, if known.
150 /// LLDB_INVALID_ADDRESS will be returned if it is unavailable.
151 //------------------------------------------------------------------
153 GetLibdispatchQueueAddress () const;
157 SetNumRunningWorkItems (uint32_t count);
160 SetNumPendingWorkItems (uint32_t count);
163 SetLibdispatchQueueAddress (lldb::addr_t dispatch_queue_t_addr);
166 PushPendingQueueItem (lldb::QueueItemSP item)
168 m_pending_items.push_back (item);
172 //------------------------------------------------------------------
174 //------------------------------------------------------------------
176 lldb::ProcessWP m_process_wp;
177 lldb::queue_id_t m_queue_id;
178 std::string m_queue_name;
179 uint32_t m_running_work_items_count;
180 uint32_t m_pending_work_items_count;
181 std::vector<lldb::QueueItemSP> m_pending_items;
182 lldb::addr_t m_dispatch_queue_t_addr; // address of libdispatch dispatch_queue_t for this Queue
184 DISALLOW_COPY_AND_ASSIGN (Queue);
187 } // namespace lldb_private
189 #endif // liblldb_Queue_h_