Capability MainCapability; /* for non-SMP, we have one global capability */
#endif
+#if defined(RTS_SUPPORTS_THREADS)
+
nat rts_n_free_capabilities;
-#if defined(RTS_SUPPORTS_THREADS)
/* returning_worker_cond: when a worker thread returns from executing an
* external call, it needs to wait for an RTS Capability before passing
* on the result of the call to the Haskell thread that made it.
void
initCapabilities( void )
{
-#if defined(RTS_SUPPORTS_THREADS)
- initCondition(&returning_worker_cond);
- initCondition(&thread_ready_cond);
-#endif
-
#if defined(SMP)
initCapabilities_(RtsFlags.ParFlags.nNodes);
#else
initCapability(&MainCapability);
+#endif
+
+#if defined(RTS_SUPPORTS_THREADS)
+ initCondition(&returning_worker_cond);
+ initCondition(&thread_ready_cond);
rts_n_free_capabilities = 1;
#endif
threaded RTS, clients must use waitFor*Capability()).
------------------------------------------------------------------------- */
+#if defined(RTS_SUPPORTS_THREADS)
+static
+#endif
void
grabCapability( Capability** cap )
{
#if !defined(SMP)
+#if defined(RTS_SUPPORTS_THREADS)
ASSERT(rts_n_free_capabilities == 1);
rts_n_free_capabilities = 0;
+#endif
*cap = &MainCapability;
handleSignalsInThisThread();
#else
free_capabilities = (*cap)->link;
rts_n_free_capabilities--;
#endif
+#if defined(RTS_SUPPORTS_THREADS)
IF_DEBUG(scheduler, sched_belch("worker: got capability"));
+#endif
}
/* ----------------------------------------------------------------------------
rts_n_free_capabilities = 1;
#endif
// Signal that a capability is available
- signalCondition(&thread_ready_cond);
+ if (rts_n_waiting_tasks > 0) {
+ signalCondition(&thread_ready_cond);
+ }
startSchedulerTaskIfNecessary();
IF_DEBUG(scheduler, sched_belch("worker: released capability"));
}