X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSelect.c;h=32dca96cd8c7c1f389bad938213570438ce68806;hb=1c45176f3b9be75b5c4744d9ef074430bf034e3f;hp=57599bcee4ea5c93cb23b2bf0d1cd054f7135ea6;hpb=4cc37e5758909aaec9ede20604ec4f01c04b54ea;p=ghc-hetmet.git diff --git a/rts/posix/Select.c b/rts/posix/Select.c index 57599bc..32dca96 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -60,12 +60,18 @@ 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; - sleeping_queue = tso->link; + 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; + tso->_link = END_TSO_QUEUE; IF_DEBUG(scheduler,debugBelch("Waking up sleeping thread %lu\n", (unsigned long)tso->id)); // MainCapability: this code is !THREADED_RTS pushOnRunQueue(&MainCapability,tso); @@ -139,13 +145,17 @@ awaitEvent(rtsBool wait) FD_ZERO(&wfd); for(tso = blocked_queue_hd; tso != END_TSO_QUEUE; tso = next) { - next = tso->link; + next = tso->_link; + /* On FreeBSD FD_SETSIZE is unsigned. Cast it to signed int + * in order to switch off the 'comparison between signed and + * unsigned error message + */ switch (tso->why_blocked) { case BlockedOnRead: { int fd = tso->block_info.fd; - if (fd >= FD_SETSIZE) { + if (fd >= (int)FD_SETSIZE) { barf("awaitEvent: descriptor out of range"); } maxfd = (fd > maxfd) ? fd : maxfd; @@ -156,7 +166,7 @@ awaitEvent(rtsBool wait) case BlockedOnWrite: { int fd = tso->block_info.fd; - if (fd >= FD_SETSIZE) { + if (fd >= (int)FD_SETSIZE) { barf("awaitEvent: descriptor out of range"); } maxfd = (fd > maxfd) ? fd : maxfd; @@ -239,7 +249,12 @@ awaitEvent(rtsBool wait) prev = NULL; if (select_succeeded || unblock_all) { for(tso = blocked_queue_hd; tso != END_TSO_QUEUE; tso = next) { - next = tso->link; + next = tso->_link; + + if (tso->what_next == ThreadRelocated) { + continue; + } + switch (tso->why_blocked) { case BlockedOnRead: ready = unblock_all || FD_ISSET(tso->block_info.fd, &rfd); @@ -254,13 +269,13 @@ awaitEvent(rtsBool wait) if (ready) { IF_DEBUG(scheduler,debugBelch("Waking up blocked thread %lu\n", (unsigned long)tso->id)); tso->why_blocked = NotBlocked; - tso->link = END_TSO_QUEUE; + tso->_link = END_TSO_QUEUE; pushOnRunQueue(&MainCapability,tso); } else { if (prev == NULL) blocked_queue_hd = tso; else - prev->link = tso; + setTSOLink(&MainCapability, prev, tso); prev = tso; } } @@ -268,7 +283,7 @@ awaitEvent(rtsBool wait) if (prev == NULL) blocked_queue_hd = blocked_queue_tl = END_TSO_QUEUE; else { - prev->link = END_TSO_QUEUE; + prev->_link = END_TSO_QUEUE; blocked_queue_tl = prev; } }