Queue.h revision 269024
1//===-- Queue.h ------------------------------------------------*- 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#ifndef liblldb_Queue_h_ 11#define liblldb_Queue_h_ 12 13#include <vector> 14#include <string> 15 16#include "lldb/lldb-forward.h" 17#include "lldb/lldb-enumerations.h" 18#include "lldb/lldb-private.h" 19#include "lldb/Target/QueueItem.h" 20 21 22namespace lldb_private { 23 24//------------------------------------------------------------------ 25// Queue: 26// This class represents a libdispatch aka Grand Central Dispatch 27// queue in the process. 28// 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//------------------------------------------------------------------ 36 37 38class Queue : 39 public std::enable_shared_from_this<Queue> 40{ 41public: 42 43 Queue (lldb::ProcessSP process_sp, lldb::queue_id_t queue_id, const char *queue_name); 44 45 ~Queue (); 46 47 //------------------------------------------------------------------ 48 /// Get the QueueID for this Queue 49 /// 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. 55 /// 56 /// @return 57 /// The QueueID for this Queue. 58 //------------------------------------------------------------------ 59 lldb::queue_id_t 60 GetID (); 61 62 //------------------------------------------------------------------ 63 /// Get the name of this Queue 64 /// 65 /// @return 66 /// The name of the queue, if one is available. 67 /// A NULL pointer is returned if none is available. 68 //------------------------------------------------------------------ 69 const char * 70 GetName (); 71 72 //------------------------------------------------------------------ 73 /// Get the IndexID for this Queue 74 /// 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. 78 /// 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. 82 /// 83 /// @return 84 /// The IndexID for this queue. 85 //------------------------------------------------------------------ 86 uint32_t 87 GetIndexID (); 88 89 //------------------------------------------------------------------ 90 /// Return the threads currently associated with this queue 91 /// 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. 95 /// 96 /// @return 97 /// The threads currently performing work for this queue 98 //------------------------------------------------------------------ 99 std::vector<lldb::ThreadSP> 100 GetThreads (); 101 102 //------------------------------------------------------------------ 103 /// Return the items that are currently enqueued 104 /// 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". 108 /// 109 /// @return 110 /// The vector of enqueued items for this queue 111 //------------------------------------------------------------------ 112 const std::vector<lldb::QueueItemSP> & 113 GetPendingItems(); 114 115 lldb::ProcessSP 116 GetProcess() const 117 { 118 return m_process_wp.lock(); 119 } 120 121 //------------------------------------------------------------------ 122 /// Get the number of work items that this queue is currently running 123 /// 124 /// @return 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 //------------------------------------------------------------------ 129 uint32_t 130 GetNumRunningWorkItems () const; 131 132 //------------------------------------------------------------------ 133 /// Get the number of work items enqueued on this queue 134 /// 135 /// @return 136 /// The number of work items currently enqueued, waiting to 137 /// execute. 138 //------------------------------------------------------------------ 139 uint32_t 140 GetNumPendingWorkItems () const; 141 142 //------------------------------------------------------------------ 143 /// Get the dispatch_queue_t structure address for this Queue 144 /// 145 /// Get the address in the inferior process' memory of this Queue's 146 /// dispatch_queue_t structure. 147 /// 148 /// @return 149 /// The address of the dispatch_queue_t structure, if known. 150 /// LLDB_INVALID_ADDRESS will be returned if it is unavailable. 151 //------------------------------------------------------------------ 152 lldb::addr_t 153 GetLibdispatchQueueAddress () const; 154 155 156 void 157 SetNumRunningWorkItems (uint32_t count); 158 159 void 160 SetNumPendingWorkItems (uint32_t count); 161 162 void 163 SetLibdispatchQueueAddress (lldb::addr_t dispatch_queue_t_addr); 164 165 void 166 PushPendingQueueItem (lldb::QueueItemSP item) 167 { 168 m_pending_items.push_back (item); 169 } 170 171private: 172 //------------------------------------------------------------------ 173 // For Queue only 174 //------------------------------------------------------------------ 175 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 183 184 DISALLOW_COPY_AND_ASSIGN (Queue); 185}; 186 187} // namespace lldb_private 188 189#endif // liblldb_Queue_h_ 190