X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSelect.c;h=3c87fbdc70ee66ec16024f4abfb03f6b9022f721;hb=bba816223372c52fb586cda2e3f041d7791110a5;hp=932fc792fed511384d1a92cc3c51ba33b0585985;hpb=d0fb9a95f40453321b82e23d9b322e79340b48c9;p=ghc-hetmet.git diff --git a/rts/posix/Select.c b/rts/posix/Select.c index 932fc79..3c87fbd 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -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, @@ -157,7 +160,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 +171,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); @@ -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 */ +