From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8152 invoked by alias); 8 Aug 2008 17:24:11 -0000 Received: (qmail 7757 invoked by uid 22791); 8 Aug 2008 17:24:09 -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; Fri, 08 Aug 2008 17:23:30 +0000 Received: (qmail 6683 invoked from network); 8 Aug 2008 17:23:28 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 8 Aug 2008 17:23:28 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: [4/7] Adjust the ttrace target (HP-UX) to always register the main thread Date: Fri, 08 Aug 2008 17:24:00 -0000 User-Agent: KMail/1.9.9 Cc: "John David Anglin" References: <20080808164014.7AD9C4DCB@hiauly1.hia.nrc.ca> In-Reply-To: <20080808164014.7AD9C4DCB@hiauly1.hia.nrc.ca> MIME-Version: 1.0 Message-Id: <200808081822.25515.pedro@codesourcery.com> Content-Type: Multipart/Mixed; boundary="Boundary-00=_RDInIs6se+KSBdk" 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-08/txt/msg00211.txt.bz2 --Boundary-00=_RDInIs6se+KSBdk Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1239 Thanks a lot John, On Friday 08 August 2008 17:40:13, John David Anglin wrote: > (gdb) bt > #0 0x000c9960 in inf_ttrace_delete_dying_threads_callback > (info=0x4007bdb0, arg=0x0) at ../../src/gdb/inf-ttrace.c:828 > #1 0x0008b640 in iterate_over_threads ( > callback=@0x4001a712: 0xc9940 > , data=0x0) at > ../../src/gdb/thread.c:338 > #2 0x000c98e0 in inf_ttrace_resume (ptid= > {pid = 0, lwp = 16961, tid = 7024758}, step=1073949720, > signal=TARGET_SIGNAL_0) at ../../src/gdb/inf-ttrace.c:854 > #3 0x000a3390 in target_resume (ptid={pid = 0, lwp = 16961, tid = > 7024758}, step=0, signal=TARGET_SIGNAL_0) at ../../src/gdb/target.c:1789 #4 > 0x00087f88 in resume (step=0, sig=TARGET_SIGNAL_0) > at ../../src/gdb/infrun.c:1123 > #5 0x000c6db8 in startup_inferior (ntraps=1074249136) I wasn't setting the private thread info in the main thread in inf_ttrace_wait, when getting there from a fork_inferior; but, I was setting it on inf_ttrace_attach. Since this is a !target_attach_no_wait target (there's always a target_wait after an attach), I just moved the setting of the private info always to inf_ttrace_wait. Could you check this version please? -- Pedro Alves --Boundary-00=_RDInIs6se+KSBdk Content-Type: text/x-diff; charset="iso-8859-1"; name="004-ttrace_always_a_thread.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="004-ttrace_always_a_thread.diff" Content-length: 5618 2008-08-08 Pedro Alves * inf-ttrace.c (inf_ttrace_follow_fork): Register the main thread of the child fork. (inf_ttrace_attach): Add the main thread. (inf_ttrace_resume_callback): Check for exited threads. Adjust for always a thread. (inf_ttrace_wait): Decorate the main thread's ptid with lwp info using thread_change_ptid, and set its private data. Don't add the main thread here. (inf_ttrace_pid_to_str): Adjust. --- gdb/inf-ttrace.c | 86 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 31 deletions(-) Index: src/gdb/inf-ttrace.c =================================================================== --- src.orig/gdb/inf-ttrace.c 2008-08-08 13:43:19.000000000 +0100 +++ src/gdb/inf-ttrace.c 2008-08-08 18:17:50.000000000 +0100 @@ -513,10 +513,22 @@ Detaching after fork from child process if (follow_child) { + struct thread_info *ti; + /* The child will start out single-threaded. */ - inf_ttrace_num_lwps = 0; + inf_ttrace_num_lwps = 1; inf_ttrace_num_lwps_in_syscall = 0; + /* Delete parent. */ + delete_thread_silent (ptid_build (pid, lwpid, 0)); + + /* Add child. inferior_ptid was already set above. */ + ti = add_thread_silent (inferior_ptid); + ti->private = + xmalloc (sizeof (struct inf_ttrace_private_thread_info)); + memset (ti->private, 0, + sizeof (struct inf_ttrace_private_thread_info)); + /* Reset breakpoints in the child as appropriate. */ follow_inferior_reset_breakpoints (); } @@ -721,8 +733,13 @@ inf_ttrace_attach (char *args, int from_ (uintptr_t)&tte, sizeof tte, 0) == -1) perror_with_name (("ttrace")); - inferior_ptid = pid_to_ptid (pid); push_target (ttrace_ops_hack); + + /* We'll bump inf_ttrace_num_lwps up and add the private data to the + thread as soon as we get to inf_ttrace_wait. At this point, we + don't have lwpid info yet. */ + inferior_ptid = pid_to_ptid (pid); + add_thread_silent (inferior_ptid); } static void @@ -787,7 +804,7 @@ inf_ttrace_kill (void) static int inf_ttrace_resume_callback (struct thread_info *info, void *arg) { - if (!ptid_equal (info->ptid, inferior_ptid)) + if (!ptid_equal (info->ptid, inferior_ptid) && !is_exited (info->ptid)) { pid_t pid = ptid_get_pid (info->ptid); lwpid_t lwpid = ptid_get_lwp (info->ptid); @@ -824,7 +841,7 @@ inf_ttrace_resume (ptid_t ptid, int step if (ttrace (request, pid, lwpid, TT_NOPC, sig, 0) == -1) perror_with_name (("ttrace")); - if (ptid_equal (ptid, minus_one_ptid) && inf_ttrace_num_lwps > 0) + if (ptid_equal (ptid, minus_one_ptid)) { /* Let all the other threads run too. */ iterate_over_threads (inf_ttrace_resume_callback, NULL); @@ -886,6 +903,30 @@ inf_ttrace_wait (ptid_t ptid, struct tar ptid = ptid_build (tts.tts_pid, tts.tts_lwpid, 0); + if (inf_ttrace_num_lwps == 0) + { + struct thread_info *ti; + + inf_ttrace_num_lwps = 1; + + /* This is the earliest we hear about the lwp member of + INFERIOR_PTID, after an attach or fork_inferior. */ + gdb_assert (ptid_get_lwp (inferior_ptid) == 0); + + /* We haven't set the private member on the main thread yet. Do + it now. */ + ti = find_thread_pid (inferior_ptid); + gdb_assert (ti != NULL && ti->private == NULL); + ti->private = + xmalloc (sizeof (struct inf_ttrace_private_thread_info)); + memset (ti->private, 0, + sizeof (struct inf_ttrace_private_thread_info)); + + /* Notify the core that this ptid changed. This changes + inferior_ptid as well. */ + thread_change_ptid (inferior_ptid, ptid); + } + switch (tts.tts_event) { #ifdef TTEVT_BPT_SSTEP @@ -958,17 +999,6 @@ inf_ttrace_wait (ptid_t ptid, struct tar case TTEVT_LWP_CREATE: lwpid = tts.tts_u.tts_thread.tts_target_lwpid; ptid = ptid_build (tts.tts_pid, lwpid, 0); - if (inf_ttrace_num_lwps == 0) - { - /* Now that we're going to be multi-threaded, add the - original thread to the list first. */ - ti = add_thread (ptid_build (tts.tts_pid, tts.tts_lwpid, 0)); - ti->private = - xmalloc (sizeof (struct inf_ttrace_private_thread_info)); - memset (ti->private, 0, - sizeof (struct inf_ttrace_private_thread_info)); - inf_ttrace_num_lwps++; - } ti = add_thread (ptid); ti->private = xmalloc (sizeof (struct inf_ttrace_private_thread_info)); @@ -1045,11 +1075,6 @@ inf_ttrace_wait (ptid_t ptid, struct tar if (ttrace (TT_PROC_STOP, tts.tts_pid, 0, 0, 0, 0) == -1) perror_with_name (("ttrace")); - /* HACK: Twiddle INFERIOR_PTID such that the initial thread of a - process isn't recognized as a new thread. */ - if (ptid_get_lwp (inferior_ptid) == 0) - inferior_ptid = ptid; - return ptid; } @@ -1128,18 +1153,17 @@ inf_ttrace_thread_alive (ptid_t ptid) static char * inf_ttrace_pid_to_str (ptid_t ptid) { - if (inf_ttrace_num_lwps > 0) - { - pid_t pid = ptid_get_pid (ptid); - lwpid_t lwpid = ptid_get_lwp (ptid); - static char buf[128]; - - xsnprintf (buf, sizeof buf, "process %ld, lwp %ld", - (long)pid, (long)lwpid); - return buf; - } + pid_t pid = ptid_get_pid (ptid); + lwpid_t lwpid = ptid_get_lwp (ptid); + static char buf[128]; - return normal_pid_to_str (ptid); + if (lwpid == 0) + xsnprintf (buf, sizeof buf, "process %ld", + (long) pid); + else + xsnprintf (buf, sizeof buf, "process %ld, lwp %ld", + (long) pid, (long) lwpid); + return buf; } --Boundary-00=_RDInIs6se+KSBdk--