2011-08-26 Pedro Alves <pedro@codesourcery.com>
gdb/ * linux-nat.c (wait_lwp): Avoid assuming errno is preserved by a library call. Avoid reading the `status' local if all waitpid calls failed.
This commit is contained in:
parent
e5798bef38
commit
a9f4bb2123
@ -1,3 +1,9 @@
|
|||||||
|
2011-08-26 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
|
* linux-nat.c (wait_lwp): Avoid assuming errno is preserved by a
|
||||||
|
library call. Avoid reading the `status' local if all waitpid
|
||||||
|
calls failed.
|
||||||
|
|
||||||
2011-08-26 Pedro Alves <pedro@codesourcery.com>
|
2011-08-26 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* common/linux-osdata.c (get_cores_used_by_process): Don't assume
|
* common/linux-osdata.c (get_cores_used_by_process): Don't assume
|
||||||
|
@ -2377,6 +2377,18 @@ wait_lwp (struct lwp_info *lp)
|
|||||||
pid = my_waitpid (GET_LWP (lp->ptid), &status, WNOHANG);
|
pid = my_waitpid (GET_LWP (lp->ptid), &status, WNOHANG);
|
||||||
if (pid == -1 && errno == ECHILD)
|
if (pid == -1 && errno == ECHILD)
|
||||||
pid = my_waitpid (GET_LWP (lp->ptid), &status, __WCLONE | WNOHANG);
|
pid = my_waitpid (GET_LWP (lp->ptid), &status, __WCLONE | WNOHANG);
|
||||||
|
if (pid == -1 && errno == ECHILD)
|
||||||
|
{
|
||||||
|
/* The thread has previously exited. We need to delete it
|
||||||
|
now because, for some vendor 2.4 kernels with NPTL
|
||||||
|
support backported, there won't be an exit event unless
|
||||||
|
it is the main thread. 2.6 kernels will report an exit
|
||||||
|
event for each thread that exits, as expected. */
|
||||||
|
thread_dead = 1;
|
||||||
|
if (debug_linux_nat)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "WL: %s vanished.\n",
|
||||||
|
target_pid_to_str (lp->ptid));
|
||||||
|
}
|
||||||
if (pid != 0)
|
if (pid != 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2418,19 +2430,6 @@ wait_lwp (struct lwp_info *lp)
|
|||||||
|
|
||||||
restore_child_signals_mask (&prev_mask);
|
restore_child_signals_mask (&prev_mask);
|
||||||
|
|
||||||
if (pid == -1 && errno == ECHILD)
|
|
||||||
{
|
|
||||||
/* The thread has previously exited. We need to delete it
|
|
||||||
now because, for some vendor 2.4 kernels with NPTL
|
|
||||||
support backported, there won't be an exit event unless
|
|
||||||
it is the main thread. 2.6 kernels will report an exit
|
|
||||||
event for each thread that exits, as expected. */
|
|
||||||
thread_dead = 1;
|
|
||||||
if (debug_linux_nat)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "WL: %s vanished.\n",
|
|
||||||
target_pid_to_str (lp->ptid));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!thread_dead)
|
if (!thread_dead)
|
||||||
{
|
{
|
||||||
gdb_assert (pid == GET_LWP (lp->ptid));
|
gdb_assert (pid == GET_LWP (lp->ptid));
|
||||||
@ -2442,15 +2441,15 @@ wait_lwp (struct lwp_info *lp)
|
|||||||
target_pid_to_str (lp->ptid),
|
target_pid_to_str (lp->ptid),
|
||||||
status_to_str (status));
|
status_to_str (status));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if the thread has exited. */
|
/* Check if the thread has exited. */
|
||||||
if (WIFEXITED (status) || WIFSIGNALED (status))
|
if (WIFEXITED (status) || WIFSIGNALED (status))
|
||||||
{
|
{
|
||||||
thread_dead = 1;
|
thread_dead = 1;
|
||||||
if (debug_linux_nat)
|
if (debug_linux_nat)
|
||||||
fprintf_unfiltered (gdb_stdlog, "WL: %s exited.\n",
|
fprintf_unfiltered (gdb_stdlog, "WL: %s exited.\n",
|
||||||
target_pid_to_str (lp->ptid));
|
target_pid_to_str (lp->ptid));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thread_dead)
|
if (thread_dead)
|
||||||
|
Loading…
Reference in New Issue
Block a user