From 18b4689639782462532fce44dfd2854ccdbf01ff Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Fri, 13 Jul 2012 20:18:18 +0000 Subject: [PATCH] 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 --- lldb/include/lldb/API/SBProcess.h | 6 +++ lldb/scripts/Python/interface/SBProcess.i | 21 ++++++++++ lldb/scripts/Python/interface/SBThread.i | 6 +++ lldb/source/API/SBProcess.cpp | 47 +++++++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/lldb/include/lldb/API/SBProcess.h b/lldb/include/lldb/API/SBProcess.h index 23eac8f990b0..c0d77bec2ee3 100644 --- a/lldb/include/lldb/API/SBProcess.h +++ b/lldb/include/lldb/API/SBProcess.h @@ -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 diff --git a/lldb/scripts/Python/interface/SBProcess.i b/lldb/scripts/Python/interface/SBProcess.i index 4efc1359d247..018e2c20c44b 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 ac6e699fcc61..2f012ecf715f 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 b764e559f934..801daa4bfc5d 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) {