- StgTSO* tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
- scheduleThread(tso);
- return waitThread(tso, ret);
+ StgTSO* tso;
+ Capability *cap = rtsApiCapability;
+ rtsApiCapability = NULL;
+
+ tso = createStrictIOThread(RtsFlags.GcFlags.initialStkSize, p);
+ return scheduleWaitThread(tso,ret,cap);
+}
+
+/*
+ * 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,rtsApiCapability);
+ rtsApiCapability = NULL;
+
+ if (stat == Success && ret != NULL) {
+ ASSERT(r != NULL);
+ *ret = getStablePtr((StgPtr)r);
+ }
+
+ return stat;