diff options
author | Michael Snyder <msnyder@vmware.com> | 1997-07-15 01:05:10 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 1997-07-15 01:05:10 +0000 |
commit | f14465c3a713e7f877b872c66bd1936b57d685a3 (patch) | |
tree | 34d571e6bd94d70e9e204f289f0c0ed2806fe268 /gdb/procfs.c | |
parent | 3fc2c14638d8f495d31ba709838db145d3d609b5 (diff) | |
download | gdb-f14465c3a713e7f877b872c66bd1936b57d685a3.zip gdb-f14465c3a713e7f877b872c66bd1936b57d685a3.tar.gz gdb-f14465c3a713e7f877b872c66bd1936b57d685a3.tar.bz2 |
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).
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; |