From f14465c3a713e7f877b872c66bd1936b57d685a3 Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Tue, 15 Jul 1997 01:05:10 +0000 Subject: [PATCH] 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/ChangeLog | 5 +++++ gdb/procfs.c | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b4344ab02c9..1552bbc6b07 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +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). + start-sanitize-gdbtk Thu Jul 10 00:02:41 1997 Martin M. Hunt diff --git a/gdb/procfs.c b/gdb/procfs.c index aceaff71f42..e8215a523be 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; -- 2.30.2