- StgTSO* tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
- scheduleThread(tso);
- return waitThread(tso, ret);
+ StgTSO* tso;
+
+ tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
+ return scheduleWaitThread(tso,ret);
+}
+
+/*
+ * Identical to rts_evalLazyIO(), but won't create a new task/OS thread
+ * to evaluate the Haskell thread. Used by main() only. Hack.
+ */
+
+SchedulerStatus
+rts_mainLazyIO(HaskellObj p, /*out*/HaskellObj *ret)
+{
+ StgTSO* tso;
+
+ tso = createIOThread(RtsFlags.GcFlags.initialStkSize, p);
+ scheduleThread(tso);
+ return waitThread(tso, ret);
+}
+
+/*
+ * rts_evalStableIO() is suitable for calling from Haskell. It
+ * evaluates a value of the form (StablePtr (IO a)), forcing the
+ * action's result to WHNF before returning. The result is returned
+ * in a StablePtr.
+ */
+SchedulerStatus
+rts_evalStableIO (HsStablePtr s, /*out*/HsStablePtr *ret)
+{
+ StgTSO* tso;
+ StgClosure *p, *r;
+ SchedulerStatus stat;
+
+ p = (StgClosure *)deRefStablePtr(s);
+ tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
+ stat = scheduleWaitThread(tso,&r);
+
+ if (stat == Success) {
+ ASSERT(r != NULL);
+ *ret = getStablePtr((StgPtr)r);
+ }
+
+ return stat;