From 8901e61c4705b8888676250e89731f40ca198751 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 29 Sep 2010 21:29:16 +0000 Subject: [PATCH] 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. --- rts/posix/Select.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/rts/posix/Select.c b/rts/posix/Select.c index 932fc79..0127b3c 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 */ + -- 1.7.10.4