Allow "INLINEABLE" as a synonym
[ghc-hetmet.git] / rts / posix / Select.c
index bf4b7ae..932fc79 100644 (file)
@@ -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 <sys/select.h>
+# endif
 
 # ifdef HAVE_SYS_TYPES_H
 #  include <sys/types.h>
@@ -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;