/* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.62 2002/04/26 22:35:55 sof Exp $
+ * $Id: RtsStartup.c,v 1.63 2002/05/11 00:16:12 sof Exp $
*
* (c) The GHC Team, 1998-2000
*
if (!rts_has_started_up)
return;
rts_has_started_up=0;
-
+
/* start timing the shutdown */
stat_startExit();
+ /* stop all running tasks */
+ exitScheduler();
+
#if !defined(GRAN)
/* Finalize any remaining weak pointers */
finalizeWeakPointersNow();
end_gr_simulation();
#endif
- /* stop all running tasks */
- exitScheduler();
-
/* stop the ticker */
stopVirtTimer();
/* ---------------------------------------------------------------------------
- * $Id: Schedule.c,v 1.141 2002/04/26 22:35:54 sof Exp $
+ * $Id: Schedule.c,v 1.142 2002/05/11 00:16:11 sof Exp $
*
* (c) The GHC Team, 1998-2000
*
StgTSO dummy_tso;
rtsBool ready_to_gc;
+rtsBool shutting_down_scheduler = rtsFalse;
void addToBlockedQueue ( StgTSO *tso );
if ( EMPTY_RUN_QUEUE() ) {
/* Give up our capability */
releaseCapability(cap);
+
+ /* If we're in the process of shutting down (& running the
+ * a batch of finalisers), don't wait around.
+ */
+ if ( shutting_down_scheduler ) {
+ RELEASE_LOCK(&sched_mutex);
+ return;
+ }
IF_DEBUG(scheduler, sched_belch("thread %d: waiting for work", osThreadId()));
waitForWorkCapability(&sched_mutex, &cap, rtsTrue);
IF_DEBUG(scheduler, sched_belch("thread %d: work now available", osThreadId()));
-#if 0
- while ( EMPTY_RUN_QUEUE() ) {
- waitForWorkCapability(&sched_mutex, &cap);
- IF_DEBUG(scheduler, sched_belch("thread %d: work now available", osThreadId()));
- }
-#endif
}
#endif
#if defined(RTS_SUPPORTS_THREADS)
stopTaskManager();
#endif
+ shutting_down_scheduler = rtsTrue;
}
/* -----------------------------------------------------------------------------