--- pth_sched.c.orig	Fri Aug 24 05:06:27 2001
+++ pth_sched.c	Fri Aug 24 05:03:32 2001
@@ -367,6 +367,69 @@
 }
 
 /*
+ * Checks to see if fd has error errnum.  Assumes ev->ev_type == PTH_EVENT_FD,
+ * *rfds, *wfds, *efds have been FD_ZEROd, and *delay is zeroed.
+ */
+intern int pth_check_fd_error(pth_event_t ev, int errnum, fd_set *rfds, fd_set *wfds, fd_set *efds,
+	struct timeval *delay)
+{
+	int rc;
+
+	if(ev->ev_goal & PTH_UNTIL_FD_READABLE)
+		FD_SET(ev->ev_args.FD.fd, rfds);
+	if(ev->ev_goal & PTH_UNTIL_FD_WRITEABLE)
+		FD_SET(ev->ev_args.FD.fd, wfds);
+	if(ev->ev_goal & PTH_UNTIL_FD_EXCEPTION)
+		FD_SET(ev->ev_args.FD.fd, efds);
+	while ((rc = pth_sc(select)(ev->ev_args.FD.fd+1, rfds, wfds, efds, delay)) < 0
+		&& errno == EINTR) ;
+	if(rc > 0) {
+		FD_CLR(ev->ev_args.FD.fd, rfds);
+		FD_CLR(ev->ev_args.FD.fd, wfds);
+		FD_CLR(ev->ev_args.FD.fd, efds);
+	} else if(rc == -1) {
+		/* sets and timeval undefined when error occurs */
+		FD_ZERO(rfds);
+		FD_ZERO(wfds);
+		FD_ZERO(efds);
+		delay->tv_sec = 0;
+		delay->tv_usec = 0;
+	}
+	return_errno(rc == -1 && errno == errnum, errnum);
+}
+
+/*
+ * Checks to see if select has error errnum.  Assumes ev->ev_type == PTH_EVENT_SELECT and
+ * *delay is zeroed.
+ */
+intern int pth_check_select_error(pth_event_t ev, int errnum, struct timeval *delay)
+{
+	fd_set *prfds = NULL;
+	fd_set *pwfds = NULL;
+	fd_set *pefds = NULL;
+	fd_set rfds;
+	fd_set wfds;
+	fd_set efds;
+	int rc;
+
+	if(ev->ev_args.SELECT.rfds)
+		memcpy((prfds = &rfds), ev->ev_args.SELECT.rfds, sizeof(rfds));
+	if(ev->ev_args.SELECT.wfds)
+		memcpy((pwfds = &wfds), ev->ev_args.SELECT.wfds, sizeof(wfds));
+	if(ev->ev_args.SELECT.efds)
+		memcpy((pefds = &efds), ev->ev_args.SELECT.efds, sizeof(efds));
+
+	while ((rc = pth_sc(select)(ev->ev_args.SELECT.nfd+1, prfds, pwfds, pefds, delay)) < 0
+			&& errno == EINTR) ;
+
+	if(rc < 0) {
+		delay->tv_sec = 0;
+		delay->tv_usec = 0;
+	}
+	return_errno(rc == -1 && errno == errnum, errnum);
+}
+
+/*
  * Look whether some events already occurred and move
  * corresponding threads from waiting queue back to ready queue.
  */
@@ -647,6 +710,7 @@
         FD_ZERO(&rfds);
         FD_ZERO(&wfds);
         FD_ZERO(&efds);
+        pth_time_set(&delay, PTH_TIME_ZERO);
     }
 
     /* now comes the final cleanup loop where we've to
@@ -670,12 +734,15 @@
                 if (!ev->ev_occurred) {
                     /* Filedescriptor I/O */
                     if (ev->ev_type == PTH_EVENT_FD) {
-                        if (   (   ev->ev_goal & PTH_UNTIL_FD_READABLE
+                        if ((rc > 0 &&
+                        	   ((   ev->ev_goal & PTH_UNTIL_FD_READABLE
                                 && FD_ISSET(ev->ev_args.FD.fd, &rfds))
                             || (   ev->ev_goal & PTH_UNTIL_FD_WRITEABLE
                                 && FD_ISSET(ev->ev_args.FD.fd, &wfds))
                             || (   ev->ev_goal & PTH_UNTIL_FD_EXCEPTION
-                                && FD_ISSET(ev->ev_args.FD.fd, &efds)) ) {
+                                && FD_ISSET(ev->ev_args.FD.fd, &efds))))
+                            || (rc < 0
+                            	&& pth_check_fd_error(ev, errno, &rfds, &wfds, &efds, &delay)) ) {
                             pth_debug2("pth_sched_eventmanager: "
                                        "[I/O] event occurred for thread \"%s\"", t->name);
                             ev->ev_occurred = TRUE;
@@ -683,7 +750,7 @@
                     }
                     /* Filedescriptor Set I/O */
                     else if (ev->ev_type == PTH_EVENT_SELECT) {
-                        if (pth_util_fds_test(ev->ev_args.SELECT.nfd,
+                        if (rc > 0 && pth_util_fds_test(ev->ev_args.SELECT.nfd,
                                               ev->ev_args.SELECT.rfds, &rfds,
                                               ev->ev_args.SELECT.wfds, &wfds,
                                               ev->ev_args.SELECT.efds, &efds)) {
@@ -696,6 +763,8 @@
                             ev->ev_occurred = TRUE;
                             pth_debug2("pth_sched_eventmanager: "
                                        "[I/O] event occurred for thread \"%s\"", t->name);
+                        } else if(rc < 0 && pth_check_select_error(ev, errno, &delay)) {
+                        	ev->ev_occurred = TRUE;
                         }
                     }
                     /* Signal Set */
