/* -----------------------------------------------------------------------------
- * $Id: Schedule.h,v 1.38 2003/03/17 14:47:48 simonmar Exp $
+ * $Id: Schedule.h,v 1.41 2003/10/01 10:57:43 wolfgang Exp $
*
* (c) The GHC Team 1998-1999
*
*/
void wakeBlockedWorkerThread(void); /* In Select.c */
+/* resetWorkerWakeupPipeAfterFork()
+ *
+ * Notify Select.c that a fork() has occured
+ *
+ * Called from STG : NO
+ * Locks assumed : don't care, but must be called right after fork()
+ */
+void resetWorkerWakeupPipeAfterFork(void); /* In Select.c */
/* GetRoots(evac_fn f)
*
extern nat rts_n_waiting_tasks;
#endif
-StgInt forkProcess(StgTSO *tso);
+StgBool rtsSupportsBoundThreads(void);
+StgBool isThreadBound(StgTSO *tso);
+StgInt forkProcess(HsStablePtr *entry);
extern SchedulerStatus rts_mainLazyIO(HaskellObj p, /*out*/HaskellObj *ret);
*
* These are the threads which clients have requested that we run.
*
- * In a 'threaded' build, we might have several concurrent clients all
- * waiting for results, and each one will wait on a condition variable
- * until the result is available.
+ * In a 'threaded' build, each of these corresponds to one bound thread.
+ * The pointer to the StgMainThread is passed as a parameter to schedule;
+ * this invocation of schedule will always pass this main thread's
+ * bound_thread_cond to waitForkWorkCapability; OS-thread-switching
+ * takes place using passCapability.
*
- * In non-SMP, clients are strictly nested: the first client calls
+ * In non-threaded builds, clients are strictly nested: the first client calls
* into the RTS, which might call out again to C with a _ccall_GC, and
* eventually re-enter the RTS.
*
SchedulerStatus stat;
StgClosure ** ret;
#if defined(RTS_SUPPORTS_THREADS)
- Condition wakeup;
#if defined(THREADED_RTS)
- rtsBool thread_bound;
Condition bound_thread_cond;
+#else
+ Condition wakeup;
#endif
#endif
struct StgMainThread_ *link;
#if defined(RTS_SUPPORTS_THREADS)
/* If no task is waiting for a capability,
+ * and if there is work to be done
+ * or if we need to wait for IO or delay requests,
* spawn a new worker thread.
- *
- * (Used by the RtsAPI)
*/
void
-startSchedulerTask(void);
+startSchedulerTaskIfNecessary(void);
#endif
#endif /* __SCHEDULE_H__ */