From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31365 invoked by alias); 10 Dec 2012 18:37:00 -0000 Received: (qmail 31249 invoked by uid 22791); 10 Dec 2012 18:36:58 -0000 X-SWARE-Spam-Status: No, hits=-4.7 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_CP X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 10 Dec 2012 18:36:51 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1Ti8Dh-0004ba-T7 from Ali_Anwar@mentor.com ; Mon, 10 Dec 2012 10:36:49 -0800 Received: from SVR-ORW-FEM-03.mgc.mentorg.com ([147.34.97.39]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 10 Dec 2012 10:36:49 -0800 Received: from [137.202.157.121] (147.34.91.1) by SVR-ORW-FEM-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server (TLS) id 14.1.289.1; Mon, 10 Dec 2012 10:36:48 -0800 Message-ID: <50C62BBB.6010404@codesourcery.com> Date: Mon, 10 Dec 2012 18:37:00 -0000 From: ali_anwar User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Tom Tromey CC: Subject: Re: Updated patch for Bug 13217 - thread apply all detach throws a SEGFAULT References: <5062EA9B.1060505@codesourcery.com> <871uhnwkf3.fsf@fleche.redhat.com> In-Reply-To: <871uhnwkf3.fsf@fleche.redhat.com> Content-Type: multipart/mixed; boundary="------------020006020903000406000709" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-12/txt/msg00268.txt.bz2 --------------020006020903000406000709 Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit Content-length: 884 On 09/27/2012 08:32 PM, Tom Tromey wrote: >>>>>> "Ali" == ali anwar 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 --------------020006020903000406000709 Content-Type: text/x-patch; name="isssue_13217.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="isssue_13217.patch" Content-length: 3406 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 + + PR threads/13217 + * thread.c (thread_apply_all_command): Check for valid threads + and thread count. + 2012-12-09 Jan Kratochvil * 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" --------------020006020903000406000709--