summaryrefslogtreecommitdiff
path: root/rts/posix
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-09-29 21:29:16 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-09-29 21:29:16 +0000
commit8901e61c4705b8888676250e89731f40ca198751 (patch)
tree837ef132411d7d0c25c3c340b8ee8a58f19b9510 /rts/posix
parent4a05e6139d756c0473df7a6dcb257074201f843d (diff)
downloadhaskell-8901e61c4705b8888676250e89731f40ca198751.tar.gz
give a better error message in the non-threaded RTS for out-of-range FDs
# ./aw aw: file descriptor 1027 out of range for select (0--1024). Recompile with -threaded to work around this.
Diffstat (limited to 'rts/posix')
-rw-r--r--rts/posix/Select.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/rts/posix/Select.c b/rts/posix/Select.c
index 932fc792fe..0127b3cef4 100644
--- a/rts/posix/Select.c
+++ b/rts/posix/Select.c
@@ -81,6 +81,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,
@@ -157,7 +164,7 @@ awaitEvent(rtsBool wait)
{
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);
@@ -168,7 +175,7 @@ awaitEvent(rtsBool wait)
{
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);
@@ -294,3 +301,4 @@ awaitEvent(rtsBool wait)
}
#endif /* THREADED_RTS */
+