summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/API/SBProcess.h6
-rw-r--r--lldb/scripts/Python/interface/SBProcess.i21
-rw-r--r--lldb/scripts/Python/interface/SBThread.i6
-rw-r--r--lldb/source/API/SBProcess.cpp47
4 files changed, 80 insertions, 0 deletions
diff --git a/lldb/include/lldb/API/SBProcess.h b/lldb/include/lldb/API/SBProcess.h
index 23eac8f990b..c0d77bec2ee 100644
--- a/lldb/include/lldb/API/SBProcess.h
+++ b/lldb/include/lldb/API/SBProcess.h
@@ -105,6 +105,9 @@ public:
GetThreadByID (lldb::tid_t sb_thread_id);
lldb::SBThread
+ GetThreadByIndexID (uint32_t index_id);
+
+ lldb::SBThread
GetSelectedThread () const;
bool
@@ -112,6 +115,9 @@ public:
bool
SetSelectedThreadByID (uint32_t tid);
+
+ bool
+ SetSelectedThreadByIndexID (uint32_t index_id);
//------------------------------------------------------------------
// Stepping related functions
diff --git a/lldb/scripts/Python/interface/SBProcess.i b/lldb/scripts/Python/interface/SBProcess.i
index 4efc1359d24..018e2c20c44 100644
--- a/lldb/scripts/Python/interface/SBProcess.i
+++ b/lldb/scripts/Python/interface/SBProcess.i
@@ -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
//------------------------------------------------------------------
diff --git a/lldb/scripts/Python/interface/SBThread.i b/lldb/scripts/Python/interface/SBThread.i
index ac6e699fcc6..2f012ecf715 100644
--- a/lldb/scripts/Python/interface/SBThread.i
+++ b/lldb/scripts/Python/interface/SBThread.i
@@ -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),
diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp
index b764e559f93..801daa4bfc5 100644
--- a/lldb/source/API/SBProcess.cpp
+++ b/lldb/source/API/SBProcess.cpp
@@ -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)
{
OpenPOWER on IntegriCloud