From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24070 invoked by alias); 8 Aug 2008 01:36:52 -0000 Received: (qmail 24062 invoked by uid 22791); 8 Aug 2008 01:36:51 -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 01:36:16 +0000 Received: (qmail 32459 invoked from network); 8 Aug 2008 01:36:14 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 8 Aug 2008 01:36:14 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [4/7] Adjust the ttrace target (HP-UX) to always register the main thread Date: Fri, 08 Aug 2008 01:36:00 -0000 User-Agent: KMail/1.9.9 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_3M6mI+8WFuilJRx" Message-Id: <200808080236.55396.pedro@codesourcery.com> 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/msg00173.txt.bz2 --Boundary-00=_3M6mI+8WFuilJRx Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 643 This patch adjusts the inf-ttrace target to always register the main thread in GDB's thread table. Again, I'm using the new thread_change_ptid function to update inferior_ptid. ( I haven't touched the hpux-thread.c target, as it is still waiting for someone to rewrite it as a thread_stratum target, and remove its dependency on deprecated_child_ops. That is, it's dead broken code currently. While we're on to it, does anyone still care for HP-UX / ptrace (not ttrace) ? ) I have no means to test this. Can anybody with HP-UX access check if I didn't break anything? This patch only depends on patch 1 of the series. -- Pedro Alves --Boundary-00=_3M6mI+8WFuilJRx Content-Type: text/x-diff; charset="utf-8"; name="004-ttrace_always_a_thread.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="004-ttrace_always_a_thread.diff" Content-length: 5413 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. Don't add the main thread here. (inf_ttrace_pid_to_str): Adjust. --- gdb/inf-ttrace.c | 78 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 31 deletions(-) Index: src/gdb/inf-ttrace.c =================================================================== --- src.orig/gdb/inf-ttrace.c 2008-08-05 19:40:06.000000000 +0100 +++ src/gdb/inf-ttrace.c 2008-08-05 23:04:02.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 (); } @@ -675,6 +687,7 @@ inf_ttrace_attach (char *args, int from_ pid_t pid; char *dummy; ttevent_t tte; + struct thread_info *ti; if (!args) error_no_arg (_("process-id to attach")); @@ -721,8 +734,18 @@ 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 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); + 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)); } static void @@ -787,7 +810,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 +847,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 +909,16 @@ inf_ttrace_wait (ptid_t ptid, struct tar ptid = ptid_build (tts.tts_pid, tts.tts_lwpid, 0); + if (inf_ttrace_num_lwps == 0) + { + inf_ttrace_num_lwps = 1; + + /* This is the earliest we hear about the lwp member of + INFERIOR_PTID, after an attach or fork-child. */ + if (ptid_get_lwp (inferior_ptid) == 0) + thread_change_ptid (inferior_ptid, ptid); + } + switch (tts.tts_event) { #ifdef TTEVT_BPT_SSTEP @@ -958,17 +991,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 +1067,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 +1145,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=_3M6mI+8WFuilJRx--