[project @ 2004-07-15 20:42:45 by sof]
authorsof <unknown>
Thu, 15 Jul 2004 20:42:45 +0000 (20:42 +0000)
committersof <unknown>
Thu, 15 Jul 2004 20:42:45 +0000 (20:42 +0000)
awaitEvent(): for Integrity, use socketpair() instead of pipe() to implement socket()-aborting mechanism

ghc/rts/Select.c

index d7e6ffc..30e715e 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Select.c,v 1.30 2003/10/01 10:49:09 wolfgang Exp $
+ * $Id: Select.c,v 1.31 2004/07/15 20:42:45 sof Exp $
  *
  * (c) The GHC Team 1995-2002
  *
 #include <unistd.h>
 #endif
 
+#ifdef INTEGRITY
+#include <sys/socket.h>
+#endif
+
 /* last timestamp */
 nat timestamp = 0;
 
@@ -166,7 +170,19 @@ awaitEvent(rtsBool wait)
 
 #ifdef RTS_SUPPORTS_THREADS
       if(!workerWakeupInited) {
+#if defined(INTEGRITY)
+       int arg;
+       int rc = socketpair(AF_LOCAL, SOCK_STREAM, 0, workerWakeupPipe);
+       if (rc == -1) {
+         printf("failed to create socketpair: %d\n", errno);
+       }
+       arg = fcntl(workerWakeupPipe[0], F_GETFL,0);
+       fcntl(workerWakeupPipe[0], F_SETFL, arg | O_NONBLOCK);
+       arg = fcntl(workerWakeupPipe[1], F_GETFL,0);
+       fcntl(workerWakeupPipe[1], F_SETFL, arg | O_NONBLOCK);
+#else
           pipe(workerWakeupPipe);
+#endif
           workerWakeupInited = rtsTrue;
       }
       FD_SET(workerWakeupPipe[0], &rfd);
@@ -345,10 +361,9 @@ wakeBlockedWorkerThread()
 {
     if(isWorkerBlockedInAwaitEvent && !workerWakeupPending) {
        unsigned char dummy = 42;       // Any value will do here
-       
-                       // write something so that select() wakes up
-       write(workerWakeupPipe[1],&dummy,1);
+       // write something so that select() wakes up
        workerWakeupPending = rtsTrue;
+       write(workerWakeupPipe[1],&dummy,1);
     }
 }