X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSelect.c;h=16824818ec8f7a9eadacec2ab3a97e9dd5d04b82;hb=433cdcade29d3a887e4db32b241b98a0eadb39d0;hp=486ccbaccc0139a3ca21e027f26e705b136c793a;hpb=5a4ec9379ff8e96ab7a75ea1854bf2005db01050;p=ghc-hetmet.git diff --git a/ghc/rts/Select.c b/ghc/rts/Select.c index 486ccba..1682481 100644 --- a/ghc/rts/Select.c +++ b/ghc/rts/Select.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Select.c,v 1.14 2000/08/25 13:12:07 simonmar Exp $ + * $Id: Select.c,v 1.16 2001/02/28 14:23:55 sewardj Exp $ * * (c) The GHC Team 1995-1999 * @@ -17,7 +17,7 @@ #include "Itimer.h" #include "Signals.h" -# if defined(HAVE_SYS_TYPES_H) +# ifdef HAVE_SYS_TYPES_H # include # endif @@ -25,6 +25,10 @@ # include # endif +# ifdef mingw32_TARGET_OS +# include +# endif + /* last timestamp */ nat timestamp = 0; @@ -70,24 +74,23 @@ wakeUpSleepingThreads(nat ticks) * otherwise we wait (see Schedule.c). * * SMP note: must be called with sched_mutex locked. + * + * Windows: select only works on sockets, so this doesn't really work, + * though it makes things better than before. MsgWaitForMultipleObjects + * should really be used, though it only seems to work for read handles, + * not write handles. + * */ void awaitEvent(rtsBool wait) { -#ifdef mingw32_TARGET_OS -/* - * Win32 doesn't support select(). ToDo: use MsgWaitForMultipleObjects() - * to achieve (similar) effect. - * - */ - return; -#else - StgTSO *tso, *prev, *next; rtsBool ready; fd_set rfd,wfd; +#ifndef mingw32_TARGET_OS int numFound; int maxfd = -1; +#endif rtsBool select_succeeded = rtsTrue; struct timeval tv; lnat min, ticks; @@ -125,6 +128,7 @@ awaitEvent(rtsBool wait) min = 0x7ffffff; } +#ifndef mingw32_TARGET_OS /* * Collect all of the fd's that we're interested in */ @@ -176,14 +180,20 @@ awaitEvent(rtsBool wait) tv.tv_usec = min % 1000000; while ((numFound = select(maxfd+1, &rfd, &wfd, NULL, &tv)) < 0) { - if (errno != EINTR) { - /* fflush(stdout); */ + + printf("%d\n", errno); + fflush(stdout); perror("select"); barf("select failed"); } +#else /* on mingwin */ + while (1) { + Sleep(0); /* don't busy wait */ +#endif /* mingw32_TARGET_OS */ ACQUIRE_LOCK(&sched_mutex); - + +#ifndef mingw32_TARGET_OS /* We got a signal; could be one of ours. If so, we need * to start up the signal handler straight away, otherwise * we could block for a long time before the signal is @@ -195,7 +205,8 @@ awaitEvent(rtsBool wait) ACQUIRE_LOCK(&sched_mutex); return; /* still hold the lock */ } - +#endif + /* we were interrupted, return to the scheduler immediately. */ if (interrupted) { @@ -260,5 +271,4 @@ awaitEvent(rtsBool wait) } } while (wait && !interrupted && run_queue_hd == END_TSO_QUEUE); -#endif }