From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12211 invoked by alias); 24 Mar 2008 20:54:57 -0000 Received: (qmail 12196 invoked by uid 22791); 24 Mar 2008 20:54:57 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 24 Mar 2008 20:54:36 +0000 Received: (qmail 30627 invoked from network); 24 Mar 2008 20:54:34 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 24 Mar 2008 20:54:34 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Make linux native always have at least one thread Date: Mon, 24 Mar 2008 20:54:00 -0000 User-Agent: KMail/1.9.6 (enterprise 0.20070907.709405) MIME-Version: 1.0 Message-Id: <200803242054.39769.pedro@codesourcery.com> Content-Type: Multipart/Mixed; boundary="Boundary-00=_PUB6HRymwvUI+Ln" 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: 2008-03/txt/msg00365.txt.bz2 --Boundary-00=_PUB6HRymwvUI+Ln Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 852 The non-stop mode requires gdb to always have a thread in the thread list, so we can use the new non-stop MI options on it. In ST programs, the main thread should be listed as the single thread in the thread list. Currently, when debugging a single-threaded application in native linux, "info threads" comes out empty. Ideally, every platform should do this, so we can get rid of a lot of weird ugly code to work around that fact (state is stored and swapped between plain old global variables, and struct thread_info, struct execution_control_state, and struct inferior_status depending on what gdb is doing). Daniel recently made this fix very simple, by removing the tid component of a thread_db thread off of the ptid of each thread. So, this patch closes the issue for linux native. Tested on x86_64-unknown-linux-gnu. OK? -- Pedro Alves --Boundary-00=_PUB6HRymwvUI+Ln Content-Type: text/x-diff; charset="us-ascii"; name="linux_always_have_a_thread.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="linux_always_have_a_thread.diff" Content-length: 1970 2008-01-24 Pedro Alves * linux-nat.c (linux_nat_attach): Add the pid we attached to, to gdb's thread list. (linux_nat_wait): Add main lwp to gdb's thread list. * linux-thread-db.c (find_new_threads_callback): Also attach to already listed threads which thread_db didn't know about yet. --- gdb/linux-nat.c | 6 ++++++ gdb/linux-thread-db.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) Index: src/gdb/linux-nat.c =================================================================== --- src.orig/gdb/linux-nat.c 2008-03-24 20:42:25.000000000 +0000 +++ src/gdb/linux-nat.c 2008-03-24 20:47:11.000000000 +0000 @@ -1173,6 +1173,10 @@ linux_nat_attach (char *args, int from_t lp = add_lwp (inferior_ptid); lp->cloned = cloned; + /* If this process is not using thread_db, then we still don't + detect any other threads, but add at least this one. */ + add_thread_silent (lp->ptid); + lp->stopped = 1; lp->resumed = 1; @@ -2387,6 +2391,8 @@ linux_nat_wait (ptid_t ptid, struct targ GET_PID (inferior_ptid)); lp = add_lwp (inferior_ptid); lp->resumed = 1; + /* Add the main thread to GDB's thread list. */ + add_thread_silent (lp->ptid); } sigemptyset (&flush_mask); Index: src/gdb/linux-thread-db.c =================================================================== --- src.orig/gdb/linux-thread-db.c 2008-03-24 20:42:25.000000000 +0000 +++ src/gdb/linux-thread-db.c 2008-03-24 20:42:29.000000000 +0000 @@ -918,6 +918,7 @@ find_new_threads_callback (const td_thrh td_thrinfo_t ti; td_err_e err; ptid_t ptid; + struct thread_info *tp; err = td_thr_get_info_p (th_p, &ti); if (err != TD_OK) @@ -945,7 +946,8 @@ find_new_threads_callback (const td_thrh return 0; } - if (!in_thread_list (ptid)) + tp = find_thread_pid (ptid); + if (tp == NULL || tp->private == NULL) attach_thread (ptid, th_p, &ti); return 0; --Boundary-00=_PUB6HRymwvUI+Ln--