Re: [4/7] Adjust the ttrace target (HP-UX) to always register the main thread

Pedro Alves
2008-08-08T17:24:11Z

[-- Attachment #1: Type: text/plain, Size: 1239 bytes --]

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
> <inf_ttrace_delete_dying_threads_callback>, 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

[-- Attachment #2: 004-ttrace_always_a_thread.diff --]
[-- Type: text/x-diff, Size: 5618 bytes --]

2008-08-08 Pedro Alves <pedro@codesourcery.com>

* 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;
}
\f