[1/2] Hoist code on marking thread as exited

Message ID 1491426942-6306-2-git-send-email-yao.qi@linaro.org
State New, archived
Headers

Commit Message

Yao Qi April 5, 2017, 9:15 p.m. UTC
  This patch hoists code on marking thread as exited, so more code is shared
for two different paths (thread_info is deleted or is not deleted).

gdb:

2017-04-05  Yao Qi  <yao.qi@linaro.org>

	* thread.c (delete_thread_1): Hoist code on marking thread as
	exited.
---
 gdb/thread.c | 33 ++++++++++++---------------------
 1 file changed, 12 insertions(+), 21 deletions(-)
  

Comments

Pedro Alves April 6, 2017, 9:27 a.m. UTC | #1
On 04/05/2017 10:15 PM, Yao Qi wrote:
> This patch hoists code on marking thread as exited, so more code is shared
> for two different paths (thread_info is deleted or is not deleted).
> 
> gdb:
> 
> 2017-04-05  Yao Qi  <yao.qi@linaro.org>
> 
> 	* thread.c (delete_thread_1): Hoist code on marking thread as
> 	exited.

OK.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/thread.c b/gdb/thread.c
index fd9022f..cc3af7a 100644
--- a/gdb/thread.c
+++ b/gdb/thread.c
@@ -434,35 +434,26 @@  delete_thread_1 (ptid_t ptid, int silent)
   if (tp->step_over_next != NULL)
     thread_step_over_chain_remove (tp);
 
-  /* If this is the current thread, or there's code out there that
-     relies on it existing (refcount > 0) we can't delete yet.  Mark
-     it as exited, and notify it.  */
-  if (tp->refcount > 0
-      || ptid_equal (tp->ptid, inferior_ptid))
+  if (tp->state != THREAD_EXITED)
     {
-      if (tp->state != THREAD_EXITED)
-	{
-	  observer_notify_thread_exit (tp, silent);
+      observer_notify_thread_exit (tp, silent);
 
-	  /* Tag it as exited.  */
-	  tp->state = THREAD_EXITED;
+      /* Tag it as exited.  */
+      tp->state = THREAD_EXITED;
 
-	  /* Clear breakpoints, etc. associated with this thread.  */
-	  clear_thread_inferior_resources (tp);
-	}
+      /* Clear breakpoints, etc. associated with this thread.  */
+      clear_thread_inferior_resources (tp);
+    }
 
+  /* If this is the current thread, or there's code out there that
+     relies on it existing (refcount > 0) we can't delete yet.  */
+  if (tp->refcount > 0
+      || ptid_equal (tp->ptid, inferior_ptid))
+    {
        /* Will be really deleted some other time.  */
        return;
      }
 
-  /* Notify thread exit, but only if we haven't already.  */
-  if (tp->state != THREAD_EXITED)
-    observer_notify_thread_exit (tp, silent);
-
-  /* Tag it as exited.  */
-  tp->state = THREAD_EXITED;
-  clear_thread_inferior_resources (tp);
-
   if (tpprev)
     tpprev->next = tp->next;
   else