From f14465c3a713e7f877b872c66bd1936b57d685a3 Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Tue, 15 Jul 1997 01:05:10 +0000 Subject: Mon Jul 14 18:02:53 1997 Michael Snyder (msnyder@cleaver.cygnus.com) * procfs.c (wait_fd): Handle an fd that has "hung up" or otherwise terminated (Solaris threads). --- gdb/procfs.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'gdb/procfs.c') 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; -- cgit v1.1