Index: source/Plugins/Process/POSIX/ProcessPOSIX.cpp
===================================================================
--- source/Plugins/Process/POSIX/ProcessPOSIX.cpp	(revision 154566)
+++ source/Plugins/Process/POSIX/ProcessPOSIX.cpp	(working copy)
@@ -482,20 +482,14 @@
     return DisableSoftwareBreakpoint(bp_site);
 }
 
-uint32_t
-ProcessPOSIX::UpdateThreadListIfNeeded()
-{
-    // Do not allow recursive updates.
-    return m_thread_list.GetSize(false);
-}
-
-uint32_t
+bool
 ProcessPOSIX::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
 {
     LogSP log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
         log->Printf ("ProcessPOSIX::%s() (pid = %i)", __FUNCTION__, GetID());
 
+    bool has_updated = false;
     // Update the process thread list with this new thread.
     // FIXME: We should be using tid, not pid.
     assert(m_monitor);
@@ -503,13 +497,14 @@
     if (!thread_sp) {
         ProcessSP me = this->shared_from_this();
         thread_sp.reset(new POSIXThread(me, GetID()));
+        has_updated = true;
     }
 
     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
         log->Printf ("ProcessPOSIX::%s() updated pid = %i", __FUNCTION__, GetID());
     new_thread_list.AddThread(thread_sp);
 
-    return new_thread_list.GetSize(false);
+    return has_updated; // the list has been updated
 }
 
 ByteOrder
Index: source/Plugins/Process/POSIX/ProcessPOSIX.h
===================================================================
--- source/Plugins/Process/POSIX/ProcessPOSIX.h	(revision 154566)
+++ source/Plugins/Process/POSIX/ProcessPOSIX.h	(working copy)
@@ -102,11 +102,9 @@
     virtual lldb_private::Error
     DisableBreakpoint(lldb_private::BreakpointSite *bp_site);
 
-    virtual uint32_t
-    UpdateThreadListIfNeeded();
-
-    virtual uint32_t
-    UpdateThreadList(lldb_private::ThreadList &old_thread_list, 
+    // This method returns true if the list was actually updated or false otherwise.
+    virtual bool
+    UpdateThreadList(lldb_private::ThreadList &old_thread_list,
                      lldb_private::ThreadList &new_thread_list) = 0;
 
     virtual lldb::ByteOrder
Index: source/Plugins/Process/FreeBSD/ProcessFreeBSD.h
===================================================================
--- source/Plugins/Process/FreeBSD/ProcessFreeBSD.h	(revision 154566)
+++ source/Plugins/Process/FreeBSD/ProcessFreeBSD.h	(working copy)
@@ -54,7 +54,7 @@
     ProcessFreeBSD(lldb_private::Target& target,
                    lldb_private::Listener &listener);
 
-    virtual uint32_t
+    virtual bool
     UpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &new_thread_list);
 
     //------------------------------------------------------------------
Index: source/Plugins/Process/FreeBSD/ProcessFreeBSD.cpp
===================================================================
--- source/Plugins/Process/FreeBSD/ProcessFreeBSD.cpp	(revision 154566)
+++ source/Plugins/Process/FreeBSD/ProcessFreeBSD.cpp	(working copy)
@@ -131,11 +131,31 @@
 {
 }
 
-uint32_t
+bool
 ProcessFreeBSD::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list)
 {
-    // XXX haxx
-    new_thread_list = old_thread_list;
-  
-    return 0;
+    LogSP log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
+    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
+        log->Printf ("ProcessFreeBSD::%s() (pid = %i)", __FUNCTION__, GetID());
+
+    bool has_updated = false;
+
+    const tid_t tid = Host::GetCurrentThreadID();
+    const lldb::pid_t pid = GetID();
+    // Update the process thread list with this new thread.
+    // FIXME: We should be using tid, not pid.
+    assert(m_monitor);
+    ThreadSP thread_sp (old_thread_list.FindThreadByID (pid, false));
+    if (!thread_sp) {
+        ProcessSP me = this->shared_from_this();
+        thread_sp.reset(new POSIXThread(me, pid));
+        has_updated = true;
+    }
+
+    if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
+        log->Printf ("ProcessFreeBSD::%s() updated tid = %i", __FUNCTION__, pid);
+
+    new_thread_list.AddThread(thread_sp);
+
+    return has_updated; // the list has been updated
 }
