diff options
Diffstat (limited to 'gdb/procfs.c')
-rw-r--r-- | gdb/procfs.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/gdb/procfs.c b/gdb/procfs.c index aceaff7..e8215a5 100644 --- a/gdb/procfs.c +++ b/gdb/procfs.c @@ -840,7 +840,7 @@ procfs_write_pckill (pi) static struct procinfo * wait_fd () { - struct procinfo *pi; + struct procinfo *pi, *next_pi; #ifndef LOSING_POLL int num_fds; int i; @@ -850,6 +850,7 @@ wait_fd () attached process. */ set_sigio_trap (); + wait_again: #ifndef LOSING_POLL while (1) { @@ -891,20 +892,24 @@ wait_fd () if (0 == (poll_list[i].revents & (POLLWRNORM | POLLPRI | POLLERR | POLLHUP | POLLNVAL))) continue; - for (pi = procinfo_list; pi; pi = pi->next) + for (pi = procinfo_list; pi; pi = next_pi) { + next_pi = pi->next; if (poll_list[i].fd == pi->ctl_fd) { - if (!procfs_read_status(pi)) - { - /* The LWP has apparently terminated. */ + num_fds--; + if ((poll_list[i].revents & POLLHUP) != 0 || + !procfs_read_status(pi)) + { /* The LWP has apparently terminated. */ if (info_verbose) - printf_filtered ("LWP %d doesn't respond.\n", + printf_filtered ("LWP %d exited.\n", (pi->pid >> 16) & 0xffff); - /* could call close_proc_file here, but I'm afraid to... */ + close_proc_file (pi); + if (num_fds != 0) + continue; /* already another event to process */ + else + goto wait_again; /* wait for another event */ } - - num_fds--; pi->had_event = 1; break; } @@ -3398,7 +3403,7 @@ procfs_wait (pid, ourstatus) default: error ("PIOCWSTOP, unknown why %d, what %d", why, what); } -/* Stop all the other threads when any of them stops. */ + /* Stop all the other threads when any of them stops. */ { struct procinfo *procinfo, *next_pi; |