1 //===-- ThreadCollection.cpp ------------------------------------*- 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 #include <stdlib.h>
10 
11 #include <algorithm>
12 
13 #include "lldb/Target/ThreadCollection.h"
14 #include "lldb/Target/Thread.h"
15 
16 using namespace lldb;
17 using namespace lldb_private;
18 
19 ThreadCollection::ThreadCollection() :
20     m_threads(),
21     m_mutex()
22 {
23 }
24 
25 ThreadCollection::ThreadCollection(collection threads) :
26     m_threads(threads),
27     m_mutex()
28 {
29 }
30 
31 void
32 ThreadCollection::AddThread (const ThreadSP &thread_sp)
33 {
34     std::lock_guard<std::recursive_mutex> guard(GetMutex());
35     m_threads.push_back (thread_sp);
36 }
37 
38 void
39 ThreadCollection::AddThreadSortedByIndexID (const ThreadSP &thread_sp)
40 {
41     std::lock_guard<std::recursive_mutex> guard(GetMutex());
42     // Make sure we always keep the threads sorted by thread index ID
43     const uint32_t thread_index_id = thread_sp->GetIndexID();
44     if (m_threads.empty() || m_threads.back()->GetIndexID() < thread_index_id)
45         m_threads.push_back (thread_sp);
46     else
47     {
48         m_threads.insert(std::upper_bound(m_threads.begin(), m_threads.end(), thread_sp,
49                                           [] (const ThreadSP &lhs, const ThreadSP &rhs) -> bool
50                                           {
51                                               return lhs->GetIndexID() < rhs->GetIndexID();
52                                           }), thread_sp);
53     }
54 }
55 
56 void
57 ThreadCollection::InsertThread (const lldb::ThreadSP &thread_sp, uint32_t idx)
58 {
59     std::lock_guard<std::recursive_mutex> guard(GetMutex());
60     if (idx < m_threads.size())
61         m_threads.insert(m_threads.begin() + idx, thread_sp);
62     else
63         m_threads.push_back (thread_sp);
64 }
65 
66 uint32_t
67 ThreadCollection::GetSize ()
68 {
69     std::lock_guard<std::recursive_mutex> guard(GetMutex());
70     return m_threads.size();
71 }
72 
73 ThreadSP
74 ThreadCollection::GetThreadAtIndex (uint32_t idx)
75 {
76     std::lock_guard<std::recursive_mutex> guard(GetMutex());
77     ThreadSP thread_sp;
78     if (idx < m_threads.size())
79         thread_sp = m_threads[idx];
80     return thread_sp;
81 }
82