FB_
#if defined(GRAN)
- STGCALL0(void,(),GranSimBlock); /* Before overwriting TSO_LINK */
+ /* Before overwriting TSO_LINK */
+ STGCALL3(void,(),GranSimBlock,CurrentTSO,CurrentProc,Node);
#endif
TSO_LINK(CurrentTSO) = (P_) BQ_ENTRIES(Node);
}
#endif
#if defined(GRAN)
- ReSchedule(NEW_THREAD);
+ ReSchedule(SAME_THREAD); /* NB: GranSimBlock activated next thread */
#else
ReSchedule(0);
#endif
\begin{code}
-#ifdef PAR
+#if defined(PAR) || defined(GRAN)
STGFUN(RBH_entry)
{
FB_
-#if defined(GRAN)
- STGCALL0(void, (), GranSimBlock); /* Before overwriting TSO_LINK */
-#endif
+# if defined(GRAN)
+ /* Before overwriting TSO_LINK */
+ STGCALL3(void,(),GranSimBlock,CurrentTSO,CurrentProc,Node);
+# endif
switch (INFO_TYPE(InfoPtr)) {
case INFO_SPEC_RBH_TYPE:
QP_Event1("GR", CurrentTSO);
}
+# ifdef PAR
if(RTSflags.ParFlags.granSimStats) {
/* Note that CURRENT_TIME may perform an unsafe call */
TIME now = CURRENT_TIME;
TSO_BLOCKEDAT(CurrentTSO) = now;
DumpGranEvent(GR_BLOCK, CurrentTSO);
}
-
-#if defined(GRAN)
- ReSchedule(NEW_THREAD);
-#else
+# endif
+# if defined(GRAN)
+ ReSchedule(SAME_THREAD); /* NB: GranSimBlock activated next thread */
+# else
ReSchedule(0);
-#endif
+# endif
FE_
}
FB_
ENT_VIA_NODE();
InfoPtr=(D_)(INFO_PTR(Node));
- GRAN_EXEC(5,1,2,0,0);
JMP_(ENTRY_CODE(InfoPtr));
FE_
}
DO_RETURN_TEMPLATE(StackUnderflowEnterNode, EnterNodeCode)
-#else
+#else /* PAR */
\end{code}
* because R2 is dead, and R1 points to a PAP. Only R1 is live.
*/
+#if 0
+
+/* old version of the code */
STGFUN(StackUnderflowEnterNode)
{
FB_
FE_
}
+#else
+
+/*
+ We've inlined CommonUnderFlow because setting RetReg would zap
+ the return vector that the node needs.
+ We pick up the RetReg from the STkO header instead.
+ KH/HWL 14/2/97
+*/
+
+STGFUN(StackUnderflowEnterNode)
+{
+ P_ temp;
+ FB_
+ RetReg = STKO_RETURN(StkOReg); /* pick up return code from the StkO hdr
+ needed because we come from UpdatePAP */
+ LivenessReg = LIVENESS_R1;
+
+ temp = STKO_LINK(StkOReg);
+
+ /*? fprintf(stderr,"Stk Underflow from: %lx to: %lx size abandoned: %d\n",StkOReg,temp,STKO_CLOSURE_CTS_SIZE(StkOReg)); ?*/
+
+ /* change the guy we are abandoning into something
+ that will not be "interesting" on the mutables
+ list. (As long as it is there, it will be
+ scavenged in GC, and we cannot guarantee that
+ it is still a "sane" StkO object). (And, besides,
+ why continue to keep it [and all it pts to] alive?)
+ Will & Phil 95/10
+ */
+ FREEZE_MUT_HDR(StkOReg, ImMutArrayOfPtrs_info);
+ MUTUPLE_CLOSURE_SIZE(StkOReg) = MUTUPLE_VHS;
+
+ StkOReg = temp;
+ /* ToDo: Fetch the remote stack object here! */
+ RestoreStackStgRegs();
+ JMP_(EnterNodeCode); /* this will enter a PAP containing the old stkos
+ A and B stacks */
+ FE_
+}
#endif
+
+#endif /* !PAR */
+
const W_
vtbl_Underflow[] = {
/* "MAX_VECTORED_RTN" elements (see GhcConstants.lh) */
(W_) UnderflowVect7
};
-\end{code}
-
-\begin{code}
-
-IFN_(seqDirectReturn) {
- void *cont;
-
- FB_
- RetReg = (StgRetAddr) SpB[BREL(0)];
- cont = (void *) SpB[BREL(1)];
- SpB += BREL(2);
-/* GRAN_EXEC(1,1,2,0,0); /? ToDo: RE-CHECK (WDP) */
- JMP_(cont);
- FE_
-}
-
-/*
- NB: For direct returns to work properly, the name of the routine must be
- the same as the name of the vector table with vtbl_ removed and DirectReturn
- appended. This is all the mangler understands.
- */
-
-const W_
-vtbl_seq[] = {
- (W_) seqDirectReturn,
- (W_) seqDirectReturn,
- (W_) seqDirectReturn,
- (W_) seqDirectReturn,
- (W_) seqDirectReturn,
- (W_) seqDirectReturn,
- (W_) seqDirectReturn,
- (W_) seqDirectReturn
-};
-
#endif /* CONCURRENT */
\end{code}