X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSelect.c;h=418e48cb7a3dfcae7ce7a7a6e64d80542c0b8388;hb=cf35f01c8fda4a665d3f4cc377210ffa153fa367;hp=30e715e732587eff86874277da73ea3c6d40b29f;hpb=b87accfa195f0baa3ddf37c7593c0205ac444521;p=ghc-hetmet.git diff --git a/ghc/rts/Select.c b/ghc/rts/Select.c index 30e715e..418e48c 100644 --- a/ghc/rts/Select.c +++ b/ghc/rts/Select.c @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: Select.c,v 1.31 2004/07/15 20:42:45 sof Exp $ * * (c) The GHC Team 1995-2002 * @@ -35,20 +34,9 @@ #include #endif -#ifdef INTEGRITY -#include -#endif - /* last timestamp */ nat timestamp = 0; -#ifdef RTS_SUPPORTS_THREADS -static rtsBool isWorkerBlockedInAwaitEvent = rtsFalse; -static rtsBool workerWakeupPending = rtsFalse; -static int workerWakeupPipe[2]; -static rtsBool workerWakeupInited = rtsFalse; -#endif - /* There's a clever trick here to avoid problems when the time wraps * around. Since our maximum delay is smaller than 31 bits of ticks * (it's actually 31 bits of microseconds), we can safely check @@ -72,7 +60,7 @@ wakeUpSleepingThreads(nat ticks) sleeping_queue = tso->link; tso->why_blocked = NotBlocked; tso->link = END_TSO_QUEUE; - IF_DEBUG(scheduler,belch("Waking up sleeping thread %d\n", tso->id)); + IF_DEBUG(scheduler,debugBelch("Waking up sleeping thread %d\n", tso->id)); PUSH_ON_RUN_QUEUE(tso); flag = rtsTrue; } @@ -109,11 +97,11 @@ awaitEvent(rtsBool wait) tv.tv_usec = 0; IF_DEBUG(scheduler, - belch("scheduler: checking for threads blocked on I/O"); + debugBelch("scheduler: checking for threads blocked on I/O"); if (wait) { - belch(" (waiting)"); + debugBelch(" (waiting)"); } - belch("\n"); + debugBelch("\n"); ); /* loop until we've woken up some threads. This loop is needed @@ -168,46 +156,6 @@ 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); - maxfd = workerWakeupPipe[0] > maxfd ? workerWakeupPipe[0] : maxfd; -#endif - - /* Release the scheduler lock while we do the poll. - * this means that someone might muck with the blocked_queue - * while we do this, but it shouldn't matter: - * - * - another task might poll for I/O and remove one - * or more threads from the blocked_queue. - * - more I/O threads may be added to blocked_queue. - * - more delayed threads may be added to blocked_queue. We'll - * just subtract delta from their delays after the poll. - * - * I believe none of these cases lead to trouble --SDM. - */ - -#ifdef RTS_SUPPORTS_THREADS - isWorkerBlockedInAwaitEvent = rtsTrue; - workerWakeupPending = rtsFalse; -#endif - RELEASE_LOCK(&sched_mutex); - /* Check for any interesting events */ tv.tv_sec = min / 1000000; @@ -236,16 +184,10 @@ awaitEvent(rtsBool wait) unblock_all = rtsTrue; break; } else { - fprintf(stderr,"%d\n", errno); - fflush(stderr); perror("select"); barf("select failed"); } } - ACQUIRE_LOCK(&sched_mutex); -#ifdef RTS_SUPPORTS_THREADS - isWorkerBlockedInAwaitEvent = rtsFalse; -#endif /* We got a signal; could be one of ours. If so, we need * to start up the signal handler straight away, otherwise @@ -254,9 +196,7 @@ awaitEvent(rtsBool wait) */ #if defined(RTS_USER_SIGNALS) if (signals_pending()) { - RELEASE_LOCK(&sched_mutex); /* ToDo: kill */ startSignalHandlers(); - ACQUIRE_LOCK(&sched_mutex); return; /* still hold the lock */ } #endif @@ -277,24 +217,8 @@ awaitEvent(rtsBool wait) if (run_queue_hd != END_TSO_QUEUE) { return; /* still hold the lock */ } - -#ifdef RTS_SUPPORTS_THREADS - /* If another worker thread wants to take over, - * return to the scheduler - */ - if (needToYieldToReturningWorker()) { - return; /* still hold the lock */ - } -#endif - -#ifdef RTS_SUPPORTS_THREADS - isWorkerBlockedInAwaitEvent = rtsTrue; -#endif - RELEASE_LOCK(&sched_mutex); } - ACQUIRE_LOCK(&sched_mutex); - /* Step through the waiting queue, unblocking every thread that now has * a file descriptor in a ready state. */ @@ -315,7 +239,7 @@ awaitEvent(rtsBool wait) } if (ready) { - IF_DEBUG(scheduler,belch("Waking up blocked thread %d\n", tso->id)); + IF_DEBUG(scheduler,debugBelch("Waking up blocked thread %d\n", tso->id)); tso->why_blocked = NotBlocked; tso->link = END_TSO_QUEUE; PUSH_ON_RUN_QUEUE(tso); @@ -336,50 +260,5 @@ awaitEvent(rtsBool wait) } } -#if defined(RTS_SUPPORTS_THREADS) - // if we were woken up by wakeBlockedWorkerThread, - // read the dummy byte from the pipe - if(select_succeeded && FD_ISSET(workerWakeupPipe[0], &rfd)) { - unsigned char dummy; - wait = rtsFalse; - read(workerWakeupPipe[0],&dummy,1); - } -#endif } while (wait && !interrupted && run_queue_hd == END_TSO_QUEUE); } - - -#ifdef RTS_SUPPORTS_THREADS -/* wakeBlockedWorkerThread - * - * If a worker thread is currently blocked within awaitEvent, - * wake it. - * Must be called with sched_mutex held. - */ -void -wakeBlockedWorkerThread() -{ - if(isWorkerBlockedInAwaitEvent && !workerWakeupPending) { - unsigned char dummy = 42; // Any value will do here - // write something so that select() wakes up - workerWakeupPending = rtsTrue; - write(workerWakeupPipe[1],&dummy,1); - } -} - -/* resetWorkerWakeupPipeAfterFork - * - * To be called right after a fork(). - * After the fork(), the worker wakeup pipe will be shared - * with the parent process, and that's something we don't want. - */ -void -resetWorkerWakeupPipeAfterFork() -{ - if(workerWakeupInited) { - close(workerWakeupPipe[0]); - close(workerWakeupPipe[1]); - } - workerWakeupInited = rtsFalse; -} -#endif