LynxOS: Resume the same thread when receiving a thread create/exit event.
Before this patch, the ptid passed to lynx_resume was completely ignored, and we used the current_inferior. This resulted in trying to resume the inferior execution using the wrong ptid after having received a thread create/exit event, because the inferior_ptid was still set to the ptid prior to receiving the signal. gdb/gdbserver/ChangeLog: * lynx-low.c (lynx_resume): Use the resume_info parameter to determine the ptid for the lynx_ptrace call, unless it is equal to minus_one_ptid, in which case we use the ptid of the current_inferior. (lynx_wait_1): After having received a thread create/exit event, resume the inferior's execution using the signaling thread's ptid, rather than the old ptid.
This commit is contained in:
parent
7fda33ae8d
commit
3f6e77ef16
@ -1,3 +1,13 @@
|
|||||||
|
2013-01-07 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
|
* lynx-low.c (lynx_resume): Use the resume_info parameter
|
||||||
|
to determine the ptid for the lynx_ptrace call, unless
|
||||||
|
it is equal to minus_one_ptid, in which case we use the
|
||||||
|
ptid of the current_inferior.
|
||||||
|
(lynx_wait_1): After having received a thread create/exit
|
||||||
|
event, resume the inferior's execution using the signaling
|
||||||
|
thread's ptid, rather than the old ptid.
|
||||||
|
|
||||||
2013-01-07 Joel Brobecker <brobecker@adacore.com>
|
2013-01-07 Joel Brobecker <brobecker@adacore.com>
|
||||||
|
|
||||||
* lynx-low.c (lynx_resume): Delete variable ret.
|
* lynx-low.c (lynx_resume): Delete variable ret.
|
||||||
|
@ -349,14 +349,17 @@ lynx_attach (unsigned long pid)
|
|||||||
static void
|
static void
|
||||||
lynx_resume (struct thread_resume *resume_info, size_t n)
|
lynx_resume (struct thread_resume *resume_info, size_t n)
|
||||||
{
|
{
|
||||||
ptid_t inferior_ptid = thread_to_gdb_id (current_inferior);
|
|
||||||
/* FIXME: Assume for now that n == 1. */
|
/* FIXME: Assume for now that n == 1. */
|
||||||
|
ptid_t ptid = resume_info[0].thread;
|
||||||
const int request = (resume_info[0].kind == resume_step
|
const int request = (resume_info[0].kind == resume_step
|
||||||
? PTRACE_SINGLESTEP : PTRACE_CONT);
|
? PTRACE_SINGLESTEP : PTRACE_CONT);
|
||||||
const int signal = resume_info[0].sig;
|
const int signal = resume_info[0].sig;
|
||||||
|
|
||||||
|
if (ptid_equal (ptid, minus_one_ptid))
|
||||||
|
ptid = thread_to_gdb_id (current_inferior);
|
||||||
|
|
||||||
regcache_invalidate ();
|
regcache_invalidate ();
|
||||||
lynx_ptrace (request, inferior_ptid, 1, signal, 0);
|
lynx_ptrace (request, ptid, 1, signal, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Resume the execution of the given PTID. */
|
/* Resume the execution of the given PTID. */
|
||||||
@ -497,12 +500,12 @@ retry:
|
|||||||
case SIGNEWTHREAD:
|
case SIGNEWTHREAD:
|
||||||
/* We just added the new thread above. No need to do anything
|
/* We just added the new thread above. No need to do anything
|
||||||
further. Just resume the execution again. */
|
further. Just resume the execution again. */
|
||||||
lynx_continue (ptid);
|
lynx_continue (new_ptid);
|
||||||
goto retry;
|
goto retry;
|
||||||
|
|
||||||
case SIGTHREADEXIT:
|
case SIGTHREADEXIT:
|
||||||
remove_thread (find_thread_ptid (new_ptid));
|
remove_thread (find_thread_ptid (new_ptid));
|
||||||
lynx_continue (ptid);
|
lynx_continue (new_ptid);
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user