ThreadList.h revision 269024
1//===-- ThreadList.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_ThreadList_h_ 11#define liblldb_ThreadList_h_ 12 13#include <vector> 14 15#include "lldb/lldb-private.h" 16#include "lldb/Core/UserID.h" 17#include "lldb/Utility/Iterable.h" 18 19 20// FIXME: Currently this is a thread list with lots of functionality for use only by 21// the process for which this is the thread list. If we ever want a container class 22// to hand out that is just a random subset of threads, with iterator functionality, 23// then we should make that part a base class, and make a ProcessThreadList for the 24// process. 25namespace lldb_private { 26 27class ThreadList 28{ 29friend class Process; 30 31public: 32 33 ThreadList (Process *process); 34 35 ThreadList (const ThreadList &rhs); 36 37 ~ThreadList (); 38 39 const ThreadList& 40 operator = (const ThreadList& rhs); 41 42 uint32_t 43 GetSize(bool can_update = true); 44 45 void 46 AddThread (const lldb::ThreadSP &thread_sp); 47 48 void 49 InsertThread (const lldb::ThreadSP &thread_sp, uint32_t idx); 50 // Return the selected thread if there is one. Otherwise, return the thread 51 // selected at index 0. 52 lldb::ThreadSP 53 GetSelectedThread (); 54 55 bool 56 SetSelectedThreadByID (lldb::tid_t tid, bool notify = false); 57 58 bool 59 SetSelectedThreadByIndexID (uint32_t index_id, bool notify = false); 60 61 void 62 Clear(); 63 64 void 65 Flush(); 66 67 void 68 Destroy(); 69 70 // Note that "idx" is not the same as the "thread_index". It is a zero 71 // based index to accessing the current threads, whereas "thread_index" 72 // is a unique index assigned 73 lldb::ThreadSP 74 GetThreadAtIndex (uint32_t idx, bool can_update = true); 75 76 typedef std::vector<lldb::ThreadSP> collection; 77 typedef LockingAdaptedIterable<collection, lldb::ThreadSP, vector_adapter> ThreadIterable; 78 79 ThreadIterable 80 Threads () 81 { 82 return ThreadIterable(m_threads, GetMutex()); 83 } 84 85 lldb::ThreadSP 86 FindThreadByID (lldb::tid_t tid, bool can_update = true); 87 88 lldb::ThreadSP 89 FindThreadByProtocolID (lldb::tid_t tid, bool can_update = true); 90 91 lldb::ThreadSP 92 RemoveThreadByID (lldb::tid_t tid, bool can_update = true); 93 94 lldb::ThreadSP 95 RemoveThreadByProtocolID (lldb::tid_t tid, bool can_update = true); 96 97 lldb::ThreadSP 98 FindThreadByIndexID (uint32_t index_id, bool can_update = true); 99 100 lldb::ThreadSP 101 GetThreadSPForThreadPtr (Thread *thread_ptr); 102 103 bool 104 ShouldStop (Event *event_ptr); 105 106 Vote 107 ShouldReportStop (Event *event_ptr); 108 109 Vote 110 ShouldReportRun (Event *event_ptr); 111 112 void 113 RefreshStateAfterStop (); 114 115 //------------------------------------------------------------------ 116 /// The thread list asks tells all the threads it is about to resume. 117 /// If a thread can "resume" without having to resume the target, it 118 /// will return false for WillResume, and then the process will not be 119 /// restarted. 120 /// 121 /// @return 122 /// \b true instructs the process to resume normally, 123 /// \b false means start & stopped events will be generated, but 124 /// the process will not actually run. The thread must then return 125 /// the correct StopInfo when asked. 126 /// 127 //------------------------------------------------------------------ 128 bool 129 WillResume (); 130 131 void 132 DidResume (); 133 134 void 135 DidStop (); 136 137 void 138 DiscardThreadPlans(); 139 140 uint32_t 141 GetStopID () const; 142 143 void 144 SetStopID (uint32_t stop_id); 145 146 Mutex & 147 GetMutex (); 148 149 void 150 Update (ThreadList &rhs); 151 152protected: 153 154 void 155 SetShouldReportStop (Vote vote); 156 157 void 158 NotifySelectedThreadChanged (lldb::tid_t tid); 159 160 //------------------------------------------------------------------ 161 // Classes that inherit from Process can see and modify these 162 //------------------------------------------------------------------ 163 Process *m_process; ///< The process that manages this thread list. 164 uint32_t m_stop_id; ///< The process stop ID that this thread list is valid for. 165 collection m_threads; ///< The threads for this process. 166 lldb::tid_t m_selected_tid; ///< For targets that need the notion of a current thread. 167 168private: 169 ThreadList (); 170}; 171 172} // namespace lldb_private 173 174#endif // liblldb_ThreadList_h_ 175