CLOSE_NURSERY(); \
CurrentNursery = bdescr_link(CurrentNursery); \
OPEN_NURSERY(); \
- if (CInt[context_switch] != 0) { \
+ if (CInt[context_switch] != 0 :: CInt) { \
R1 = ThreadYielding; \
goto sched; \
} else { \
size = BITMAP_SIZE(StgFunInfoExtra_bitmap(info));
} else {
if (type == ARG_GEN_BIG) {
+#ifdef TABLES_NEXT_TO_CODE
+ // bitmap field holds an offset
+ size = StgLargeBitmap_size( StgFunInfoExtra_bitmap(info)
+ + %GET_ENTRY(R1) /* ### */ );
+#else
size = StgLargeBitmap_size( StgFunInfoExtra_bitmap(info) );
+#endif
} else {
size = BITMAP_SIZE(W_[stg_arg_bitmaps + WDS(type)]);
}
len = StgAsyncIOResult_len(ares);
errC = StgAsyncIOResult_errCode(ares);
StgTSO_block_info(CurrentTSO) = NULL;
- foreign "C" free(ares);
+ foreign "C" free(ares "ptr");
R1 = len;
Sp(0) = errC;
jump %ENTRY_CODE(Sp(1));
BLOCK_GENERIC;
}
+/* Used by threadDelay implementation; it would be desirable to get rid of
+ * this free()'ing void return continuation.
+ */
+INFO_TABLE_RET( stg_block_async_void, 0/*framesize*/, 0/*bitmap*/, RET_SMALL )
+{
+ W_ ares;
+
+ ares = StgTSO_block_info(CurrentTSO);
+ StgTSO_block_info(CurrentTSO) = NULL;
+ foreign "C" free(ares "ptr");
+ Sp_adj(1);
+ jump %ENTRY_CODE(Sp(0));
+}
+
+stg_block_async_void
+{
+ Sp_adj(-1);
+ Sp(0) = stg_block_async_void_info;
+ BLOCK_GENERIC;
+}
+
#endif