/* ---------------------------------------------------------------------------
- * $Id: Schedule.c,v 1.157 2002/10/22 11:01:19 simonmar Exp $
+ * $Id: Schedule.c,v 1.158 2002/12/10 13:38:40 wolfgang Exp $
*
* (c) The GHC Team, 1998-2000
*
#endif
)
{
- ACQUIRE_LOCK(&sched_mutex);
+ // Precondition: sched_mutex must be held.
/* Put the new thread on the head of the runnable queue. The caller
* better push an appropriate closure on this thread's stack
#if 0
IF_DEBUG(scheduler,printTSO(tso));
#endif
- RELEASE_LOCK(&sched_mutex);
}
void scheduleThread(StgTSO* tso)
{
+ ACQUIRE_LOCK(&sched_mutex);
scheduleThread_(tso, rtsFalse);
+ RELEASE_LOCK(&sched_mutex);
}
SchedulerStatus
m->link = main_threads;
main_threads = m;
- /* Inefficient (scheduleThread_() acquires it again right away),
- * but obviously correct.
- */
- RELEASE_LOCK(&sched_mutex);
-
scheduleThread_(tso, rtsTrue);
#if defined(THREADED_RTS)
- return waitThread_(m, rtsTrue);
+ return waitThread_(m, rtsTrue); // waitThread_ releases sched_mutex
#else
return waitThread_(m);
#endif
IF_DEBUG(scheduler, sched_belch("== scheduler: waiting for thread (%d)\n", tso->id));
m->link = main_threads;
main_threads = m;
- RELEASE_LOCK(&sched_mutex);
IF_DEBUG(scheduler, sched_belch("== scheduler: waiting for thread (%d)\n", tso->id));
#if defined(THREADED_RTS)
- return waitThread_(m, rtsFalse);
+ return waitThread_(m, rtsFalse); // waitThread_ releases sched_mutex
#else
return waitThread_(m);
#endif
{
SchedulerStatus stat;
+ // Precondition: sched_mutex must be held.
IF_DEBUG(scheduler, sched_belch("== scheduler: new main thread (%d)\n", m->tso->id));
#if defined(RTS_SUPPORTS_THREADS)
* gets to enter the RTS directly without going via another
* task/thread.
*/
+ RELEASE_LOCK(&sched_mutex);
schedule();
ASSERT(m->stat != NoStatus);
} else
# endif
{
- ACQUIRE_LOCK(&sched_mutex);
do {
waitCondition(&m->wakeup, &sched_mutex);
} while (m->stat == NoStatus);
procStatus[MainProc] = Busy; // status of main PE
CurrentProc = MainProc; // PE to run it on
+ RELEASE_LOCK(&sched_mutex);
schedule();
#else
RELEASE_LOCK(&sched_mutex);
#endif
RELEASE_LOCK(&sched_mutex);
+ // Postcondition: sched_mutex must not be held
return stat;
}