X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSelect.c;h=932fc792fed511384d1a92cc3c51ba33b0585985;hb=d108044bef62f6a0d579c92ced5e8188f72edc2d;hp=bf4b7ae6157d7195f935bdf405ce872b652603a9;hpb=b877faddc0cce7cceb470861a084784e0c1073b0;p=ghc-hetmet.git diff --git a/rts/posix/Select.c b/rts/posix/Select.c index bf4b7ae..932fc79 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -6,19 +6,20 @@ * * ---------------------------------------------------------------------------*/ -/* we're outside the realms of POSIX here... */ -/* #include "PosixSource.h" */ - +#include "PosixSource.h" #include "Rts.h" -#include "Storage.h" + +#include "Signals.h" #include "Schedule.h" #include "RtsUtils.h" -#include "RtsFlags.h" -#include "Timer.h" #include "Itimer.h" -#include "Signals.h" #include "Capability.h" -#include "posix/Select.h" +#include "Select.h" +#include "AwaitEvent.h" + +# ifdef HAVE_SYS_SELECT_H +# include +# endif # ifdef HAVE_SYS_TYPES_H # include @@ -60,9 +61,15 @@ wakeUpSleepingThreads(lnat ticks) StgTSO *tso; rtsBool flag = rtsFalse; - while (sleeping_queue != END_TSO_QUEUE && - (int)(ticks - sleeping_queue->block_info.target) >= 0) { + 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; + } sleeping_queue = tso->_link; tso->why_blocked = NotBlocked; tso->_link = END_TSO_QUEUE; @@ -149,7 +156,7 @@ awaitEvent(rtsBool wait) case BlockedOnRead: { int fd = tso->block_info.fd; - if (fd >= (int)FD_SETSIZE) { + if ((fd >= (int)FD_SETSIZE) || (fd < 0)) { barf("awaitEvent: descriptor out of range"); } maxfd = (fd > maxfd) ? fd : maxfd; @@ -160,7 +167,7 @@ awaitEvent(rtsBool wait) case BlockedOnWrite: { int fd = tso->block_info.fd; - if (fd >= (int)FD_SETSIZE) { + if ((fd >= (int)FD_SETSIZE) || (fd < 0)) { barf("awaitEvent: descriptor out of range"); } maxfd = (fd > maxfd) ? fd : maxfd;