Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: ali_anwar <ali_anwar@codesourcery.com>
To: Tom Tromey <tromey@redhat.com>
Cc: <gdb-patches@sourceware.org>
Subject: Re: Updated patch for Bug 13217 - thread apply all detach throws a SEGFAULT
Date: Mon, 10 Dec 2012 18:37:00 -0000	[thread overview]
Message-ID: <50C62BBB.6010404@codesourcery.com> (raw)
In-Reply-To: <871uhnwkf3.fsf@fleche.redhat.com>

[-- Attachment #1: Type: text/plain, Size: 884 bytes --]

On 09/27/2012 08:32 PM, Tom Tromey wrote:
>>>>>> "Ali" == ali anwar <ali_anwar@codesourcery.com> writes:
>
> Ali> +static int
> Ali> +thread_valid (struct thread_info *tp)
> Ali> +{
> Ali> +  struct thread_info  *utp;
> Ali> +  for (utp = thread_list; utp; utp = utp->next)
> Ali> +     if (tp == utp)
> Ali> +       return 1;
> Ali> +  return 0;
> Ali> +}
>
> Ali> +  for (tp = thread_list; thread_valid(tp); tp = tp->next)
>
> It seems like this introduces quadratic behavior here.
> I think it would be better to avoid this.
>
> Ali> +	if (thread_count() == 0)
> Ali> +	  break;
>
> Here too.
>
> Tom
>

Please find attached the modified patch. This time the complexity is 
linear. The thread list is saved first and then it is verified that each 
thread still exists or not.

Testing:
* Tested on i686-pc-linux
* Also checked with valgrind
* Executed the testuite

Thanks,
-Ali



[-- Attachment #2: isssue_13217.patch --]
[-- Type: text/x-patch, Size: 3406 bytes --]

Index: gdb/ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/ChangeLog,v
retrieving revision 1.14894
diff -u -r1.14894 ChangeLog
--- gdb/ChangeLog	9 Dec 2012 18:39:57 -0000	1.14894
+++ gdb/ChangeLog	10 Dec 2012 18:13:27 -0000
@@ -1,3 +1,9 @@
+2012-12-10  Ali Anwar  <ali_anwar@codesourcery.com>
+
+	PR threads/13217
+	* thread.c (thread_apply_all_command): Check for valid threads 
+	and thread count.
+
 2012-12-09  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
 	* configure.ac (CC_HAS_LONG_LONG): Replace by AC_MSG_ERROR.
Index: gdb/thread.c
===================================================================
RCS file: /cvs/src/src/gdb/thread.c,v
retrieving revision 1.149
diff -u -r1.149 thread.c
--- gdb/thread.c	27 Jul 2012 00:52:36 -0000	1.149
+++ gdb/thread.c	10 Dec 2012 18:13:27 -0000
@@ -1174,11 +1174,9 @@
    thread apply 1 2 7 4 backtrace       Apply backtrace cmd to threads 1,2,7,4
    thread apply 2-7 9 p foo(1)  Apply p foo(1) cmd to threads 2->7 & 9
    thread apply all p x/i $pc   Apply x/i $pc cmd to all threads.  */
-
 static void
 thread_apply_all_command (char *cmd, int from_tty)
 {
-  struct thread_info *tp;
   struct cleanup *old_chain;
   char *saved_cmd;
 
@@ -1193,18 +1191,30 @@
      execute_command.  */
   saved_cmd = xstrdup (cmd);
   make_cleanup (xfree, saved_cmd);
-  for (tp = thread_list; tp; tp = tp->next)
-    if (thread_alive (tp))
-      {
-	switch_to_thread (tp->ptid);
-
-	printf_filtered (_("\nThread %d (%s):\n"),
-			 tp->num, target_pid_to_str (inferior_ptid));
-	execute_command (cmd, from_tty);
-	strcpy (cmd, saved_cmd);	/* Restore exact command used
-					   previously.  */
-      }
 
+  if (thread_count ())
+    {
+      struct thread_info tp_array [thread_count ()];
+      struct thread_info *tp;
+      int i, k;
+
+      /* Save a copy of the thread_list in case we execute detach
+         command.  */
+      for (i = 0, tp = thread_list; tp; i++, tp = tp->next)
+        tp_array [i] = *tp;
+
+      for(k = 0; k != i; k++)
+        if (thread_alive (&tp_array [k]))
+          {
+            switch_to_thread ((&tp_array [k])->ptid);
+
+            printf_filtered (_("\nThread %d (%s):\n"),
+                             (&tp_array [k])->num, target_pid_to_str (inferior_ptid));
+            execute_command (cmd, from_tty);
+            strcpy (cmd, saved_cmd);        /* Restore exact command used
+                                               previously.  */
+           }
+    }
   do_cleanups (old_chain);
 }
Index: gdb/testsuite/gdb.threads/threadapply.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.threads/threadapply.exp,v
retrieving revision 1.15
diff -u -r1.15 threadapply.exp
--- gdb/testsuite/gdb.threads/threadapply.exp	26 Jun 2012 19:23:20 -0000	1.15
+++ gdb/testsuite/gdb.threads/threadapply.exp	10 Dec 2012 18:13:33 -0000
@@ -63,3 +63,4 @@
 gdb_test "up" ".*in main.*" "go up in the stack frame" 
 gdb_test "thread apply all print 1"  "Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1" "run a simple print command on all threads"
 gdb_test "down" "#0.*thread_function.*" "go down and check selected frame"
+gdb_test "thread apply all detach" "Detaching from.*" "detach all threads"

  reply	other threads:[~2012-12-10 18:37 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-26 11:46 ali_anwar
2012-09-26 11:50 ` ali_anwar
2012-09-27 15:27 ` Jan Kratochvil
2012-09-27 15:32 ` Tom Tromey
2012-12-10 18:37   ` ali_anwar [this message]
2012-12-10 20:20     ` Tom Tromey
2012-12-11 15:37       ` ali_anwar
2012-12-11 16:43         ` Pedro Alves
2013-07-10 10:31           ` ali_anwar
2013-07-10 12:57             ` Joel Brobecker
2013-07-10 17:55             ` Tom Tromey
2013-07-11 12:30               ` ali_anwar
2013-07-13 21:13                 ` Tom Tromey
2013-07-15 11:20                   ` ali_anwar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50C62BBB.6010404@codesourcery.com \
    --to=ali_anwar@codesourcery.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox