*
* ---------------------------------------------------------------------------*/
-/* we're outside the realms of POSIX here... */
-/* #include "PosixSource.h" */
-
+#include "PosixSource.h"
#include "Rts.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 <sys/select.h>
+# endif
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
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 (((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);
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,
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) {
- barf("awaitEvent: descriptor out of range");
+ if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
+ fdOutOfRange(fd);
}
maxfd = (fd > maxfd) ? fd : maxfd;
FD_SET(fd, &rfd);
case BlockedOnWrite:
{
int fd = tso->block_info.fd;
- if (fd >= FD_SETSIZE) {
- barf("awaitEvent: descriptor out of range");
+ if ((fd >= (int)FD_SETSIZE) || (fd < 0)) {
+ fdOutOfRange(fd);
}
maxfd = (fd > maxfd) ? fd : maxfd;
FD_SET(fd, &wfd);
* serviced.
*/
#if defined(RTS_USER_SIGNALS)
- if (signals_pending()) {
+ if (RtsFlags.MiscFlags.install_signal_handlers && signals_pending()) {
startSignalHandlers(&MainCapability);
return; /* still hold the lock */
}
prev = NULL;
if (select_succeeded || unblock_all) {
for(tso = blocked_queue_hd; tso != END_TSO_QUEUE; tso = next) {
- next = tso->link;
- switch (tso->why_blocked) {
+ next = tso->_link;
+
+ switch (tso->why_blocked) {
case BlockedOnRead:
ready = unblock_all || FD_ISSET(tso->block_info.fd, &rfd);
break;
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;
}
}
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;
}
}
}
#endif /* THREADED_RTS */
+