1 //===-- ThreadCollection.h --------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_TARGET_THREADCOLLECTION_H
10 #define LLDB_TARGET_THREADCOLLECTION_H
11 
12 #include <mutex>
13 #include <vector>
14 
15 #include "lldb/Utility/Iterable.h"
16 #include "lldb/lldb-private.h"
17 
18 namespace lldb_private {
19 
20 class ThreadCollection {
21 public:
22   typedef std::vector<lldb::ThreadSP> collection;
23   typedef LockingAdaptedIterable<collection, lldb::ThreadSP, vector_adapter,
24                                  std::recursive_mutex>
25       ThreadIterable;
26 
27   ThreadCollection();
28 
29   ThreadCollection(collection threads);
30 
31   virtual ~ThreadCollection() = default;
32 
33   uint32_t GetSize();
34 
35   void AddThread(const lldb::ThreadSP &thread_sp);
36 
37   void AddThreadSortedByIndexID(const lldb::ThreadSP &thread_sp);
38 
39   void InsertThread(const lldb::ThreadSP &thread_sp, uint32_t idx);
40 
41   // Note that "idx" is not the same as the "thread_index". It is a zero based
42   // index to accessing the current threads, whereas "thread_index" is a unique
43   // index assigned
44   lldb::ThreadSP GetThreadAtIndex(uint32_t idx);
45 
46   virtual ThreadIterable Threads() {
47     return ThreadIterable(m_threads, GetMutex());
48   }
49 
50   virtual std::recursive_mutex &GetMutex() const { return m_mutex; }
51 
52 protected:
53   collection m_threads;
54   mutable std::recursive_mutex m_mutex;
55 };
56 
57 } // namespace lldb_private
58 
59 #endif // LLDB_TARGET_THREADCOLLECTION_H
60