fix warning
[ghc-hetmet.git] / rts / posix / Select.c
index d36e122..3c87fbd 100644 (file)
@@ -63,10 +63,6 @@ wakeUpSleepingThreads(lnat ticks)
 
     while (sleeping_queue != END_TSO_QUEUE) {
        tso = sleeping_queue;
-        if (tso->what_next == ThreadRelocated) {
-            sleeping_queue = tso->_link;
-            continue;
-        }
         if (((long)ticks - (long)tso->block_info.target) < 0) {
             break;
         }
@@ -81,6 +77,13 @@ wakeUpSleepingThreads(lnat ticks)
     return flag;
 }
 
+static void GNUC3_ATTRIBUTE(__noreturn__)
+fdOutOfRange (int fd)
+{
+    errorBelch("file descriptor %d out of range for select (0--%d).\nRecompile with -threaded to work around this.", fd, (int)FD_SETSIZE);
+    stg_exit(EXIT_FAILURE);
+}
+
 /* Argument 'wait' says whether to wait for I/O to become available,
  * or whether to just check and return immediately.  If there are
  * other threads ready to run, we normally do the non-waiting variety,
@@ -156,8 +159,8 @@ awaitEvent(rtsBool wait)
        case BlockedOnRead:
          { 
            int fd = tso->block_info.fd;
-           if (fd >= (int)FD_SETSIZE) {
-               barf("awaitEvent: descriptor out of range");
+           if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
+                fdOutOfRange(fd);
            }
            maxfd = (fd > maxfd) ? fd : maxfd;
            FD_SET(fd, &rfd);
@@ -167,8 +170,8 @@ awaitEvent(rtsBool wait)
        case BlockedOnWrite:
          { 
            int fd = tso->block_info.fd;
-           if (fd >= (int)FD_SETSIZE) {
-               barf("awaitEvent: descriptor out of range");
+           if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
+                fdOutOfRange(fd);
            }
            maxfd = (fd > maxfd) ? fd : maxfd;
            FD_SET(fd, &wfd);
@@ -252,11 +255,7 @@ awaitEvent(rtsBool wait)
          for(tso = blocked_queue_hd; tso != END_TSO_QUEUE; tso = next) {
              next = tso->_link;
 
-              if (tso->what_next == ThreadRelocated) {
-                  continue;
-              }
-
-             switch (tso->why_blocked) {
+              switch (tso->why_blocked) {
              case BlockedOnRead:
                  ready = unblock_all || FD_ISSET(tso->block_info.fd, &rfd);
                  break;
@@ -294,3 +293,4 @@ awaitEvent(rtsBool wait)
 }
 
 #endif /* THREADED_RTS */
+