Fix thread name updating in Linux. "thread list" should report correct names always now.
Created new LinuxThread class inherited from POSIXThread and removed linux / freebsd ifdefs
Removed several un-needed set thread name calls

CR (and multiple suggestions): mkopec

llvm-svn: 187545
diff --git a/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp b/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp
index a5cccee..93c2966 100644
--- a/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp
+++ b/lldb/source/Plugins/Process/POSIX/POSIXThread.cpp
@@ -45,6 +45,7 @@
     : Thread(process, tid),
       m_frame_ap (),
       m_breakpoint (),
+      m_thread_name_valid (false),
       m_thread_name ()
 {
     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
@@ -111,7 +112,8 @@
 void
 POSIXThread::SetName (const char *name)
 {
-    if (name && name[0])
+    m_thread_name_valid = (name && name[0]);
+    if (m_thread_name_valid)
         m_thread_name.assign (name);
     else
         m_thread_name.clear();
@@ -120,6 +122,12 @@
 const char *
 POSIXThread::GetName ()
 {
+    if (!m_thread_name_valid)
+    {
+        SetName(Host::GetThreadName(GetProcess()->GetID(), GetID()).c_str());
+        m_thread_name_valid = true;
+    }
+
     if (m_thread_name.empty())
         return NULL;
     return m_thread_name.c_str();
@@ -460,22 +468,6 @@
 void
 POSIXThread::TraceNotify(const ProcessMessage &message)
 {
-#ifndef __FreeBSD__
-    RegisterContextPOSIX* reg_ctx = GetRegisterContextPOSIX();
-    if (reg_ctx)
-    {
-        uint32_t num_hw_wps = reg_ctx->NumSupportedHardwareWatchpoints();
-        uint32_t wp_idx;
-        for (wp_idx = 0; wp_idx < num_hw_wps; wp_idx++)
-        {
-            if (reg_ctx->IsWatchpointHit(wp_idx))
-            {
-                WatchNotify(message);
-                return;
-            }
-        }
-    }
-#endif
     SetStopInfo (StopInfo::CreateStopReasonToTrace(*this));
 }
 
diff --git a/lldb/source/Plugins/Process/POSIX/POSIXThread.h b/lldb/source/Plugins/Process/POSIX/POSIXThread.h
index 59b02a7..d051d23 100644
--- a/lldb/source/Plugins/Process/POSIX/POSIXThread.h
+++ b/lldb/source/Plugins/Process/POSIX/POSIXThread.h
@@ -91,7 +91,7 @@
 
     uint32_t FindVacantWatchpointIndex();
 
-private:
+protected:
     RegisterContextPOSIX *
     GetRegisterContextPOSIX ()
     {
@@ -107,6 +107,7 @@
 
     lldb::BreakpointSiteSP m_breakpoint;
 
+    bool m_thread_name_valid;
     std::string m_thread_name;
 
     ProcessMonitor &
@@ -117,7 +118,7 @@
 
     void BreakNotify(const ProcessMessage &message);
     void WatchNotify(const ProcessMessage &message);
-    void TraceNotify(const ProcessMessage &message);
+    virtual void TraceNotify(const ProcessMessage &message);
     void LimboNotify(const ProcessMessage &message);
     void SignalNotify(const ProcessMessage &message);
     void SignalDeliveredNotify(const ProcessMessage &message);
diff --git a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
index 1cba5f1..545e792 100644
--- a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
+++ b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
@@ -479,6 +479,12 @@
     return added_to_set;
 }
 
+POSIXThread *
+ProcessPOSIX::CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid)
+{
+    return new POSIXThread(process, tid);
+}
+
 void
 ProcessPOSIX::RefreshStateAfterStop()
 {
@@ -508,10 +514,7 @@
                 log->Printf ("ProcessPOSIX::%s() adding thread, tid = %" PRIi64, __FUNCTION__, message.GetChildTID());
             lldb::tid_t child_tid = message.GetChildTID();
             ThreadSP thread_sp;
-            thread_sp.reset(new POSIXThread(*this, child_tid));
-
-            POSIXThread *thread = static_cast<POSIXThread*>(thread_sp.get());
-            thread->SetName(Host::GetThreadName(GetID(), child_tid).c_str());
+            thread_sp.reset(CreateNewPOSIXThread(*this, child_tid));
 
             Mutex::Locker lock(m_thread_list.GetMutex());
 
@@ -821,7 +824,7 @@
     assert(m_monitor);
     ThreadSP thread_sp (old_thread_list.FindThreadByID (GetID(), false));
     if (!thread_sp) {
-        thread_sp.reset(new POSIXThread(*this, GetID()));
+        thread_sp.reset(CreateNewPOSIXThread(*this, GetID()));
     }
 
     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
diff --git a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
index fd029ef..48b19ba 100644
--- a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
+++ b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
@@ -22,6 +22,7 @@
 #include "ProcessMessage.h"
 
 class ProcessMonitor;
+class POSIXThread;
 
 class ProcessPOSIX :
     public lldb_private::Process
@@ -166,6 +167,9 @@
     bool
     AddThreadForInitialStopIfNeeded(lldb::tid_t stop_tid);
 
+    virtual POSIXThread *
+    CreateNewPOSIXThread(lldb_private::Process &process, lldb::tid_t tid);
+
 protected:
     /// Target byte order.
     lldb::ByteOrder m_byte_order;