Add accessors on process to get & set the selected thread by IndexID (useful since that's the one that "thread list" shows and it won't get reused even if the underlying system thread ID gets reused.

llvm-svn: 160187
This commit is contained in:
Jim Ingham 2012-07-13 20:18:18 +00:00
parent 5ed3ac189f
commit 18b4689639
4 changed files with 80 additions and 0 deletions

View File

@ -104,6 +104,9 @@ public:
lldb::SBThread
GetThreadByID (lldb::tid_t sb_thread_id);
lldb::SBThread
GetThreadByIndexID (uint32_t index_id);
lldb::SBThread
GetSelectedThread () const;
@ -112,6 +115,9 @@ public:
bool
SetSelectedThreadByID (uint32_t tid);
bool
SetSelectedThreadByIndexID (uint32_t index_id);
//------------------------------------------------------------------
// Stepping related functions

View File

@ -127,12 +127,30 @@ public:
uint32_t
GetNumThreads ();
%feature("autodoc", "
Returns the INDEX'th thread from the list of current threads. The index
of a thread is only valid for the current stop. For a persistent thread
identifier use either the thread ID or the IndexID. See help on SBThread
for more details.
") GetThreadAtIndex;
lldb::SBThread
GetThreadAtIndex (size_t index);
%feature("autodoc", "
Returns the thread with the given thread ID.
") GetThreadByID;
lldb::SBThread
GetThreadByID (lldb::tid_t sb_thread_id);
%feature("autodoc", "
Returns the thread with the given thread IndexID.
") GetThreadByIndexID;
lldb::SBThread
GetThreadByIndexID (uint32_t index_id);
%feature("autodoc", "
Returns the currently selected thread.
") GetSelectedThread;
lldb::SBThread
GetSelectedThread () const;
@ -142,6 +160,9 @@ public:
bool
SetSelectedThreadByID (uint32_t tid);
bool
SetSelectedThreadByIndexID (uint32_t index_id);
//------------------------------------------------------------------
// Stepping related functions
//------------------------------------------------------------------

View File

@ -12,6 +12,12 @@ namespace lldb {
%feature("docstring",
"Represents a thread of execution. SBProcess contains SBThread(s).
SBThreads can be referred to by their ID, which maps to the system specific thread
identifier, or by IndexID. The ID may or may not be unique depending on whether the
system reuses its thread identifiers. The IndexID is a monotonically increasing identifier
that will always uniquely reference a particular thread, and when that thread goes
away it will not be reused.
SBThread supports frame iteration. For example (from test/python_api/
lldbutil/iter/TestLLDBIterator.py),

View File

@ -405,6 +405,26 @@ SBProcess::SetSelectedThreadByID (uint32_t tid)
return ret_val;
}
bool
SBProcess::SetSelectedThreadByIndexID (uint32_t index_id)
{
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
bool ret_val = false;
ProcessSP process_sp(GetSP());
if (process_sp)
{
Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID (index_id);
}
if (log)
log->Printf ("SBProcess(%p)::SetSelectedThreadByID (tid=0x%x) => %s",
process_sp.get(), index_id, (ret_val ? "true" : "false"));
return ret_val;
}
SBThread
SBProcess::GetThreadAtIndex (size_t index)
{
@ -725,6 +745,33 @@ SBProcess::GetThreadByID (tid_t tid)
return sb_thread;
}
SBThread
SBProcess::GetThreadByIndexID (uint32_t index_id)
{
SBThread sb_thread;
ThreadSP thread_sp;
ProcessSP process_sp(GetSP());
if (process_sp)
{
Mutex::Locker api_locker (process_sp->GetTarget().GetAPIMutex());
Process::StopLocker stop_locker;
const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
thread_sp = process_sp->GetThreadList().FindThreadByIndexID (index_id, can_update);
sb_thread.SetThread (thread_sp);
}
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
if (log)
{
log->Printf ("SBProcess(%p)::GetThreadByID (tid=0x%x) => SBThread (%p)",
process_sp.get(),
index_id,
thread_sp.get());
}
return sb_thread;
}
StateType
SBProcess::GetStateFromEvent (const SBEvent &event)
{