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"
next prev parent 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