give a better error message in the non-threaded RTS for out-of-range FDs
authorSimon Marlow <marlowsd@gmail.com>
Wed, 29 Sep 2010 21:29:16 +0000 (21:29 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Wed, 29 Sep 2010 21:29:16 +0000 (21:29 +0000)
# ./aw
aw: file descriptor 1027 out of range for select (0--1024).
Recompile with -threaded to work around this.

rts/posix/Select.c

index 932fc79..0127b3c 100644 (file)
@@ -81,6 +81,13 @@ wakeUpSleepingThreads(lnat ticks)
     return flag;
 }
 
     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,
 /* 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,
@@ -157,7 +164,7 @@ awaitEvent(rtsBool wait)
          { 
            int fd = tso->block_info.fd;
            if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
          { 
            int fd = tso->block_info.fd;
            if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
-               barf("awaitEvent: descriptor out of range");
+                fdOutOfRange(fd);
            }
            maxfd = (fd > maxfd) ? fd : maxfd;
            FD_SET(fd, &rfd);
            }
            maxfd = (fd > maxfd) ? fd : maxfd;
            FD_SET(fd, &rfd);
@@ -168,7 +175,7 @@ awaitEvent(rtsBool wait)
          { 
            int fd = tso->block_info.fd;
            if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
          { 
            int fd = tso->block_info.fd;
            if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
-               barf("awaitEvent: descriptor out of range");
+                fdOutOfRange(fd);
            }
            maxfd = (fd > maxfd) ? fd : maxfd;
            FD_SET(fd, &wfd);
            }
            maxfd = (fd > maxfd) ? fd : maxfd;
            FD_SET(fd, &wfd);
@@ -294,3 +301,4 @@ awaitEvent(rtsBool wait)
 }
 
 #endif /* THREADED_RTS */
 }
 
 #endif /* THREADED_RTS */
+