X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FSelect.c;h=ae9c717a9a88d32a5b7b5fd11c5c67d2f80a3a5c;hb=111cd8e022e516e6ba6200687150dc02171b8b75;hp=e21ced03ab63d34b7539e2b2e03aec006ff43814;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/rts/posix/Select.c b/rts/posix/Select.c index e21ced0..ae9c717 100644 --- a/rts/posix/Select.c +++ b/rts/posix/Select.c @@ -10,6 +10,7 @@ /* #include "PosixSource.h" */ #include "Rts.h" +#include "Storage.h" #include "Schedule.h" #include "RtsUtils.h" #include "RtsFlags.h" @@ -60,12 +61,12 @@ wakeUpSleepingThreads(lnat ticks) rtsBool flag = rtsFalse; while (sleeping_queue != END_TSO_QUEUE && - (int)(ticks - sleeping_queue->block_info.target) > 0) { + (int)(ticks - sleeping_queue->block_info.target) >= 0) { tso = sleeping_queue; - sleeping_queue = tso->link; + sleeping_queue = tso->_link; tso->why_blocked = NotBlocked; - tso->link = END_TSO_QUEUE; - IF_DEBUG(scheduler,debugBelch("Waking up sleeping thread %d\n", tso->id)); + 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); flag = rtsTrue; @@ -126,7 +127,7 @@ awaitEvent(rtsBool wait) min = 0; } else if (sleeping_queue != END_TSO_QUEUE) { min = (sleeping_queue->block_info.target - ticks) - * TICK_MILLISECS * 1000; + * RtsFlags.MiscFlags.tickInterval * 1000; } else { min = 0x7ffffff; } @@ -138,13 +139,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; @@ -155,7 +160,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; @@ -207,7 +212,7 @@ awaitEvent(rtsBool wait) * serviced. */ #if defined(RTS_USER_SIGNALS) - if (signals_pending()) { + if (RtsFlags.MiscFlags.install_signal_handlers && signals_pending()) { startSignalHandlers(&MainCapability); return; /* still hold the lock */ } @@ -238,7 +243,7 @@ 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; switch (tso->why_blocked) { case BlockedOnRead: ready = unblock_all || FD_ISSET(tso->block_info.fd, &rfd); @@ -251,15 +256,15 @@ awaitEvent(rtsBool wait) } if (ready) { - IF_DEBUG(scheduler,debugBelch("Waking up blocked thread %d\n", tso->id)); + 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; } } @@ -267,7 +272,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; } }