-//@node Some convenient macros, Index, Scheduler Vars and Data Types
-//@subsection Some convenient macros
+/* Main threads:
+ *
+ * These are the threads which clients have requested that we run.
+ *
+ * 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-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.
+ *
+ * This is non-abstract at the moment because the garbage collector
+ * treats pointers to TSOs from the main thread list as "weak" - these
+ * pointers won't prevent a thread from receiving a BlockedOnDeadMVar
+ * exception.
+ *
+ * Main threads information is kept in a linked list:
+ */
+typedef struct StgMainThread_ {
+ StgTSO * tso;
+ SchedulerStatus stat;
+ StgClosure ** ret;
+#if defined(RTS_SUPPORTS_THREADS)
+#if defined(THREADED_RTS)
+ Condition bound_thread_cond;
+#else
+ Condition wakeup;
+#endif
+#endif
+ struct StgMainThread_ *prev;
+ struct StgMainThread_ *link;
+} StgMainThread;