]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/include/lldb/Target/QueueList.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / include / lldb / Target / QueueList.h
1 //===-- QueueList.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_QueueList_h_
11 #define liblldb_QueueList_h_
12
13 #include <mutex>
14 #include <vector>
15
16 #include "lldb/Utility/Iterable.h"
17 #include "lldb/Utility/UserID.h"
18 #include "lldb/lldb-private.h"
19
20 namespace lldb_private {
21
22 //------------------------------------------------------------------
23 // QueueList:
24 // This is the container for libdispatch aka Grand Central Dispatch Queue
25 // objects.
26 //
27 // Each Process will have a QueueList.  When the process execution is paused,
28 // the QueueList may be populated with Queues by the SystemRuntime.
29 //------------------------------------------------------------------
30
31 class QueueList {
32   friend class Process;
33
34 public:
35   QueueList(Process *process);
36
37   ~QueueList();
38
39   //------------------------------------------------------------------
40   /// Get the number of libdispatch queues that are available
41   ///
42   /// @return
43   ///     The number of queues that are stored in the QueueList.
44   //------------------------------------------------------------------
45   uint32_t GetSize();
46
47   //------------------------------------------------------------------
48   /// Get the Queue at a given index number
49   ///
50   /// @param [in] idx
51   ///     The index number (0-based) of the queue.
52   /// @return
53   ///     The Queue at that index number.
54   //------------------------------------------------------------------
55   lldb::QueueSP GetQueueAtIndex(uint32_t idx);
56
57   typedef std::vector<lldb::QueueSP> collection;
58   typedef LockingAdaptedIterable<collection, lldb::QueueSP, vector_adapter,
59                                  std::mutex>
60       QueueIterable;
61
62   //------------------------------------------------------------------
63   /// Iterate over the list of queues
64   ///
65   /// @return
66   ///     An Iterable object which can be used to loop over the queues
67   ///     that exist.
68   //------------------------------------------------------------------
69   QueueIterable Queues() { return QueueIterable(m_queues, m_mutex); }
70
71   //------------------------------------------------------------------
72   /// Clear out the list of queues from the QueueList
73   //------------------------------------------------------------------
74   void Clear();
75
76   //------------------------------------------------------------------
77   /// Add a Queue to the QueueList
78   ///
79   /// @param [in] queue
80   ///     Used by the SystemRuntime to populate the QueueList
81   //------------------------------------------------------------------
82   void AddQueue(lldb::QueueSP queue);
83
84   //------------------------------------------------------------------
85   /// Find a queue in the QueueList by QueueID
86   ///
87   /// @param [in] qid
88   ///     The QueueID (same as returned by Thread::GetQueueID()) to find.
89   ///
90   /// @return
91   ///     A QueueSP to the queue requested, if it is present in the QueueList.
92   ///     An empty QueueSP will be returned if this queue was not found.
93   //------------------------------------------------------------------
94   lldb::QueueSP FindQueueByID(lldb::queue_id_t qid);
95
96   //------------------------------------------------------------------
97   /// Find a queue in the QueueList by IndexID
98   ///
99   /// @param [in] index_id
100   ///     Find a queue by IndexID.  This is an integer associated with each
101   ///     unique queue seen during a debug session and will not be reused
102   ///     for a different queue.  Unlike the QueueID, a 64-bit value, this
103   ///     will tend to be an integral value like 1 or 7.
104   ///
105   /// @return
106   ///     A QueueSP to the queue requested, if it is present in the QueueList.
107   ///     An empty QueueSP will be returned if this queue was not found.
108   //------------------------------------------------------------------
109   lldb::QueueSP FindQueueByIndexID(uint32_t index_id);
110
111   std::mutex &GetMutex();
112
113 protected:
114   //------------------------------------------------------------------
115   // Classes that inherit from Process can see and modify these
116   //------------------------------------------------------------------
117   Process *m_process; ///< The process that manages this queue list.
118   uint32_t
119       m_stop_id; ///< The process stop ID that this queue list is valid for.
120   collection m_queues; ///< The queues for this process.
121   std::mutex m_mutex;
122
123 private:
124   QueueList();
125 };
126
127 } // namespace lldb_private
128
129 #endif // liblldb_QueueList_h_