+/* -----------------------------------------------------------------------------
+ Creating threads
+ -------------------------------------------------------------------------- */
+
+INLINE_HEADER void pushClosure (StgTSO *tso, StgWord c) {
+ tso->sp--;
+ tso->sp[0] = (W_) c;
+}
+
+StgTSO *
+createGenThread (Capability *cap, nat stack_size, StgClosure *closure)
+{
+ StgTSO *t;
+#if defined(GRAN)
+ t = createThread (cap, stack_size, NO_PRI);
+#else
+ t = createThread (cap, stack_size);
+#endif
+ pushClosure(t, (W_)closure);
+ pushClosure(t, (W_)&stg_enter_info);
+ return t;
+}
+
+StgTSO *
+createIOThread (Capability *cap, nat stack_size, StgClosure *closure)
+{
+ StgTSO *t;
+#if defined(GRAN)
+ t = createThread (cap, stack_size, NO_PRI);
+#else
+ t = createThread (cap, stack_size);
+#endif
+ pushClosure(t, (W_)&stg_noforceIO_info);
+ pushClosure(t, (W_)&stg_ap_v_info);
+ pushClosure(t, (W_)closure);
+ pushClosure(t, (W_)&stg_enter_info);
+ return t;
+}
+
+/*
+ * Same as above, but also evaluate the result of the IO action
+ * to whnf while we're at it.
+ */
+
+StgTSO *
+createStrictIOThread(Capability *cap, nat stack_size, StgClosure *closure)
+{
+ StgTSO *t;
+#if defined(GRAN)
+ t = createThread(cap, stack_size, NO_PRI);
+#else
+ t = createThread(cap, stack_size);
+#endif
+ pushClosure(t, (W_)&stg_forceIO_info);
+ pushClosure(t, (W_)&stg_ap_v_info);
+ pushClosure(t, (W_)closure);
+ pushClosure(t, (W_)&stg_enter_info);
+ return t;
+}
+