/* ---------------------------------------------------------------------------
- * $Id: Schedule.c,v 1.190 2004/02/27 15:56:25 simonmar Exp $
+ * $Id: Schedule.c,v 1.191 2004/02/27 15:58:54 simonmar Exp $
*
* (c) The GHC Team, 1998-2003
*
}
#if defined(RTS_SUPPORTS_THREADS)
-static Condition *bound_cond_cache = NULL;
+static Condition bound_cond_cache;
+static int bound_cond_cache_full = 0;
#endif
+
SchedulerStatus
scheduleWaitThread(StgTSO* tso, /*[out]*/HaskellObj* ret,
Capability *initialCapability)
// Allocating a new condition for each thread is expensive, so we
// cache one. This is a pretty feeble hack, but it helps speed up
// consecutive call-ins quite a bit.
- if (bound_cond_cache != NULL) {
- m->bound_thread_cond = *bound_cond_cache;
- bound_cond_cache = NULL;
+ if (bound_cond_cache_full) {
+ m->bound_thread_cond = bound_cond_cache;
+ bound_cond_cache_full = 0;
} else {
initCondition(&m->bound_thread_cond);
}
#endif
RELEASE_LOCK(&sched_mutex);
-
}
void
#if defined(RTS_SUPPORTS_THREADS)
// Free the condition variable, returning it to the cache if possible.
- if (bound_cond_cache == NULL) {
- *bound_cond_cache = m->bound_thread_cond;
+ if (!bound_cond_cache_full) {
+ bound_cond_cache = m->bound_thread_cond;
+ bound_cond_cache_full = 1;
} else {
closeCondition(&m->bound_thread_cond);
}