#include "Cmm.h"
+#ifdef __PIC__
+import pthread_mutex_unlock;
+#endif
+import EnterCriticalSection;
+import LeaveCriticalSection;
+
/* Stack/Heap Check Failure
* ------------------------
*
+---------------------+
| f_closure |
+---------------------+
- | tag |
- +- - - - - - - - - - -+
| size |
+---------------------+
| stg_gc_fun_info |
W_ size;
W_ info;
W_ type;
- W_ tag;
- W_ ret_fun;
- tag = GETTAG(R1);
info = %GET_FUN_INFO(UNTAG(R1));
// cache the size
#ifdef NO_ARG_REGS
// we don't have to save any registers away
Sp_adj(-3);
+ Sp(2) = R1;
+ Sp(1) = size;
Sp(0) = stg_gc_fun_info;
- ret_fun = Sp;
- StgRetFun_size(ret_fun) = HALF_W_(size);
- StgRetFun_tag(ret_fun) = HALF_W_(tag);
- StgRetFun_fun(ret_fun) = R1;
GC_GENERIC
#else
W_ type;
if (type == ARG_GEN || type == ARG_GEN_BIG) {
// regs already saved by the heap check code
Sp_adj(-3);
+ Sp(2) = R1;
+ Sp(1) = size;
Sp(0) = stg_gc_fun_info;
- ret_fun = Sp;
- StgRetFun_size(ret_fun) = HALF_W_(size);
- StgRetFun_tag(ret_fun) = HALF_W_(tag);
- StgRetFun_fun(ret_fun) = R1;
// DEBUG_ONLY(foreign "C" debugBelch("stg_fun_gc_gen(ARG_GEN)"););
GC_GENERIC
} else {
INFO_TABLE_RET( stg_gc_fun, RET_FUN )
{
- // Grab the fun, but remember to add in the tag. The GC doesn't
- // guarantee to retain the tag on the pointer, so we have to do
- // it manually, because the function entry code assumes it.
- W_ ret_fun;
- ret_fun = Sp;
- R1 = StgRetFun_fun(ret_fun) | TO_W_(StgRetFun_tag(ret_fun));
+ R1 = Sp(2);
Sp_adj(3);
#ifdef NO_ARG_REGS
// Minor optimisation: there are no argument registers to load up,
stg_block_takemvar_finally
{
#ifdef THREADED_RTS
- unlockClosure(R3, stg_EMPTY_MVAR_info);
+ unlockClosure(R3, stg_MVAR_DIRTY_info);
+#else
+ SET_INFO(R3, stg_MVAR_DIRTY_info);
#endif
jump StgReturn;
}
stg_block_putmvar_finally
{
#ifdef THREADED_RTS
- unlockClosure(R3, stg_FULL_MVAR_info);
+ unlockClosure(R3, stg_MVAR_DIRTY_info);
+#else
+ SET_INFO(R3, stg_MVAR_DIRTY_info);
#endif
jump StgReturn;
}
// The last thing we do is release sched_lock, which is
// preventing other threads from accessing blackhole_queue and
// picking up this thread before we are finished with it.
- foreign "C" RELEASE_LOCK(sched_mutex "ptr");
+ RELEASE_LOCK(sched_mutex "ptr");
#endif
jump StgReturn;
}