[lldb] Abstract a superclass for a generic thread container.
Reviewed at http://reviews.llvm.org/D5200 and http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20140901/012799.html llvm-svn: 217269
This commit is contained in:
parent
b352db7f57
commit
e4d4801c3a
|
@ -0,0 +1,70 @@
|
|||
//===-- ThreadCollection.h --------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef liblldb_ThreadCollection_h_
|
||||
#define liblldb_ThreadCollection_h_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "lldb/lldb-private.h"
|
||||
#include "lldb/Host/Mutex.h"
|
||||
#include "lldb/Utility/Iterable.h"
|
||||
|
||||
namespace lldb_private {
|
||||
|
||||
class ThreadCollection
|
||||
{
|
||||
public:
|
||||
typedef std::vector<lldb::ThreadSP> collection;
|
||||
typedef LockingAdaptedIterable<collection, lldb::ThreadSP, vector_adapter> ThreadIterable;
|
||||
|
||||
ThreadCollection();
|
||||
|
||||
ThreadCollection(collection threads);
|
||||
|
||||
virtual
|
||||
~ThreadCollection()
|
||||
{
|
||||
}
|
||||
|
||||
uint32_t
|
||||
GetSize();
|
||||
|
||||
void
|
||||
AddThread (const lldb::ThreadSP &thread_sp);
|
||||
|
||||
void
|
||||
InsertThread (const lldb::ThreadSP &thread_sp, uint32_t idx);
|
||||
|
||||
// Note that "idx" is not the same as the "thread_index". It is a zero
|
||||
// based index to accessing the current threads, whereas "thread_index"
|
||||
// is a unique index assigned
|
||||
lldb::ThreadSP
|
||||
GetThreadAtIndex (uint32_t idx);
|
||||
|
||||
virtual ThreadIterable
|
||||
Threads ()
|
||||
{
|
||||
return ThreadIterable(m_threads, GetMutex());
|
||||
}
|
||||
|
||||
virtual Mutex &
|
||||
GetMutex()
|
||||
{
|
||||
return m_mutex;
|
||||
}
|
||||
|
||||
protected:
|
||||
collection m_threads;
|
||||
Mutex m_mutex;
|
||||
};
|
||||
|
||||
} // namespace lldb_private
|
||||
|
||||
#endif // liblldb_ThreadCollection_h_
|
|
@ -15,16 +15,14 @@
|
|||
#include "lldb/lldb-private.h"
|
||||
#include "lldb/Core/UserID.h"
|
||||
#include "lldb/Utility/Iterable.h"
|
||||
#include "lldb/Target/ThreadCollection.h"
|
||||
|
||||
|
||||
// FIXME: Currently this is a thread list with lots of functionality for use only by
|
||||
// the process for which this is the thread list. If we ever want a container class
|
||||
// to hand out that is just a random subset of threads, with iterator functionality,
|
||||
// then we should make that part a base class, and make a ProcessThreadList for the
|
||||
// process.
|
||||
namespace lldb_private {
|
||||
|
||||
class ThreadList
|
||||
// This is a thread list with lots of functionality for use only by the process
|
||||
// for which this is the thread list. A generic container class with iterator
|
||||
// functionality is ThreadCollection.
|
||||
class ThreadList : public ThreadCollection
|
||||
{
|
||||
friend class Process;
|
||||
|
||||
|
@ -34,6 +32,7 @@ public:
|
|||
|
||||
ThreadList (const ThreadList &rhs);
|
||||
|
||||
virtual
|
||||
~ThreadList ();
|
||||
|
||||
const ThreadList&
|
||||
|
@ -42,11 +41,6 @@ public:
|
|||
uint32_t
|
||||
GetSize(bool can_update = true);
|
||||
|
||||
void
|
||||
AddThread (const lldb::ThreadSP &thread_sp);
|
||||
|
||||
void
|
||||
InsertThread (const lldb::ThreadSP &thread_sp, uint32_t idx);
|
||||
// Return the selected thread if there is one. Otherwise, return the thread
|
||||
// selected at index 0.
|
||||
lldb::ThreadSP
|
||||
|
@ -73,15 +67,6 @@ public:
|
|||
lldb::ThreadSP
|
||||
GetThreadAtIndex (uint32_t idx, bool can_update = true);
|
||||
|
||||
typedef std::vector<lldb::ThreadSP> collection;
|
||||
typedef LockingAdaptedIterable<collection, lldb::ThreadSP, vector_adapter> ThreadIterable;
|
||||
|
||||
ThreadIterable
|
||||
Threads ()
|
||||
{
|
||||
return ThreadIterable(m_threads, GetMutex());
|
||||
}
|
||||
|
||||
lldb::ThreadSP
|
||||
FindThreadByID (lldb::tid_t tid, bool can_update = true);
|
||||
|
||||
|
@ -143,7 +128,7 @@ public:
|
|||
void
|
||||
SetStopID (uint32_t stop_id);
|
||||
|
||||
Mutex &
|
||||
virtual Mutex &
|
||||
GetMutex ();
|
||||
|
||||
void
|
||||
|
@ -162,7 +147,6 @@ protected:
|
|||
//------------------------------------------------------------------
|
||||
Process *m_process; ///< The process that manages this thread list.
|
||||
uint32_t m_stop_id; ///< The process stop ID that this thread list is valid for.
|
||||
collection m_threads; ///< The threads for this process.
|
||||
lldb::tid_t m_selected_tid; ///< For targets that need the notion of a current thread.
|
||||
|
||||
private:
|
||||
|
|
|
@ -226,6 +226,7 @@ class QueueImpl;
|
|||
class Target;
|
||||
class TargetList;
|
||||
class Thread;
|
||||
class ThreadCollection;
|
||||
class ThreadList;
|
||||
class ThreadPlan;
|
||||
class ThreadPlanBase;
|
||||
|
@ -381,6 +382,7 @@ namespace lldb {
|
|||
typedef std::weak_ptr<lldb_private::Target> TargetWP;
|
||||
typedef std::shared_ptr<lldb_private::Thread> ThreadSP;
|
||||
typedef std::weak_ptr<lldb_private::Thread> ThreadWP;
|
||||
typedef std::shared_ptr<lldb_private::ThreadCollection> ThreadCollectionSP;
|
||||
typedef std::shared_ptr<lldb_private::ThreadPlan> ThreadPlanSP;
|
||||
typedef std::shared_ptr<lldb_private::ThreadPlanTracer> ThreadPlanTracerSP;
|
||||
typedef std::shared_ptr<lldb_private::Type> TypeSP;
|
||||
|
|
|
@ -620,6 +620,7 @@
|
|||
4CF52AF8142829390051E832 /* SBFileSpecList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CF52AF7142829390051E832 /* SBFileSpecList.cpp */; };
|
||||
8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; };
|
||||
8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; };
|
||||
8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; };
|
||||
94094C6B163B6F840083A547 /* ValueObjectCast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94094C69163B6CD90083A547 /* ValueObjectCast.cpp */; };
|
||||
94145431175E63B500284436 /* lldb-versioning.h in Headers */ = {isa = PBXBuildFile; fileRef = 94145430175D7FDE00284436 /* lldb-versioning.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
941BCC7F14E48C4000BB969C /* SBTypeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568614E355F2003A195C /* SBTypeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
|
@ -1900,6 +1901,8 @@
|
|||
8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MemoryHistory.h; path = include/lldb/Target/MemoryHistory.h; sourceTree = "<group>"; };
|
||||
8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryHistoryASan.cpp; sourceTree = "<group>"; };
|
||||
8C2D6A5B197A1FDC006989C9 /* MemoryHistoryASan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryHistoryASan.h; sourceTree = "<group>"; };
|
||||
8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ThreadCollection.cpp; path = source/Target/ThreadCollection.cpp; sourceTree = "<group>"; };
|
||||
8CCB017C19BA289B0009FD44 /* ThreadCollection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ThreadCollection.h; path = include/lldb/Target/ThreadCollection.h; sourceTree = "<group>"; };
|
||||
94005E0313F438DF001EF42D /* python-wrapper.swig */ = {isa = PBXFileReference; lastKnownFileType = text; path = "python-wrapper.swig"; sourceTree = "<group>"; };
|
||||
94005E0513F45A1B001EF42D /* embedded_interpreter.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; name = embedded_interpreter.py; path = source/Interpreter/embedded_interpreter.py; sourceTree = "<group>"; };
|
||||
94031A9F13CF5B3D00DCFF3C /* PriorityPointerPair.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PriorityPointerPair.h; path = include/lldb/Utility/PriorityPointerPair.h; sourceTree = "<group>"; };
|
||||
|
@ -3711,6 +3714,8 @@
|
|||
26BC7F3C10F1B90C00F91463 /* TargetList.cpp */,
|
||||
26BC7DFA10F1B81A00F91463 /* Thread.h */,
|
||||
26BC7F3D10F1B90C00F91463 /* Thread.cpp */,
|
||||
8CCB017C19BA289B0009FD44 /* ThreadCollection.h */,
|
||||
8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */,
|
||||
26BC7DFB10F1B81A00F91463 /* ThreadList.h */,
|
||||
26BC7F3E10F1B90C00F91463 /* ThreadList.cpp */,
|
||||
26BC7DFC10F1B81A00F91463 /* ThreadPlan.h */,
|
||||
|
@ -4921,6 +4926,7 @@
|
|||
2689005413353E0400698AC0 /* UserSettingsController.cpp in Sources */,
|
||||
2689005513353E0400698AC0 /* UUID.cpp in Sources */,
|
||||
23059A0719532B96007B8189 /* LinuxSignals.cpp in Sources */,
|
||||
8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */,
|
||||
2689005613353E0400698AC0 /* Value.cpp in Sources */,
|
||||
2689005713353E0400698AC0 /* ValueObject.cpp in Sources */,
|
||||
2689005813353E0400698AC0 /* ValueObjectChild.cpp in Sources */,
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
//===-- ThreadCollection.cpp ------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "lldb/Target/ThreadCollection.h"
|
||||
|
||||
using namespace lldb;
|
||||
using namespace lldb_private;
|
||||
|
||||
ThreadCollection::ThreadCollection() :
|
||||
m_threads(),
|
||||
m_mutex()
|
||||
{
|
||||
}
|
||||
|
||||
ThreadCollection::ThreadCollection(collection threads) :
|
||||
m_threads(threads),
|
||||
m_mutex()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ThreadCollection::AddThread (const ThreadSP &thread_sp)
|
||||
{
|
||||
Mutex::Locker locker(GetMutex());
|
||||
m_threads.push_back (thread_sp);
|
||||
}
|
||||
|
||||
void
|
||||
ThreadCollection::InsertThread (const lldb::ThreadSP &thread_sp, uint32_t idx)
|
||||
{
|
||||
Mutex::Locker locker(GetMutex());
|
||||
if (idx < m_threads.size())
|
||||
m_threads.insert(m_threads.begin() + idx, thread_sp);
|
||||
else
|
||||
m_threads.push_back (thread_sp);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
ThreadCollection::GetSize ()
|
||||
{
|
||||
Mutex::Locker locker(GetMutex());
|
||||
return m_threads.size();
|
||||
}
|
||||
|
||||
ThreadSP
|
||||
ThreadCollection::GetThreadAtIndex (uint32_t idx)
|
||||
{
|
||||
Mutex::Locker locker(GetMutex());
|
||||
ThreadSP thread_sp;
|
||||
if (idx < m_threads.size())
|
||||
thread_sp = m_threads[idx];
|
||||
return thread_sp;
|
||||
}
|
|
@ -22,17 +22,17 @@ using namespace lldb;
|
|||
using namespace lldb_private;
|
||||
|
||||
ThreadList::ThreadList (Process *process) :
|
||||
ThreadCollection(),
|
||||
m_process (process),
|
||||
m_stop_id (0),
|
||||
m_threads(),
|
||||
m_selected_tid (LLDB_INVALID_THREAD_ID)
|
||||
{
|
||||
}
|
||||
|
||||
ThreadList::ThreadList (const ThreadList &rhs) :
|
||||
ThreadCollection(),
|
||||
m_process (rhs.m_process),
|
||||
m_stop_id (rhs.m_stop_id),
|
||||
m_threads (),
|
||||
m_selected_tid ()
|
||||
{
|
||||
// Use the assignment operator since it uses the mutex
|
||||
|
@ -77,25 +77,6 @@ ThreadList::SetStopID (uint32_t stop_id)
|
|||
m_stop_id = stop_id;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ThreadList::AddThread (const ThreadSP &thread_sp)
|
||||
{
|
||||
Mutex::Locker locker(GetMutex());
|
||||
m_threads.push_back(thread_sp);
|
||||
}
|
||||
|
||||
void
|
||||
ThreadList::InsertThread (const lldb::ThreadSP &thread_sp, uint32_t idx)
|
||||
{
|
||||
Mutex::Locker locker(GetMutex());
|
||||
if (idx < m_threads.size())
|
||||
m_threads.insert(m_threads.begin() + idx, thread_sp);
|
||||
else
|
||||
m_threads.push_back (thread_sp);
|
||||
}
|
||||
|
||||
|
||||
uint32_t
|
||||
ThreadList::GetSize (bool can_update)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue