X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FHeapStackCheck.hc;h=8d0c46a86a73486b5d34387af4439d08fd3610a3;hb=50027272414438955dbc41696541cbd25da55883;hp=8f66e92e30ce8d88771226490e14015f5096e983;hpb=c6ab4bfa09886be3bfff4aa747af2f1c8e348a1f;p=ghc-hetmet.git diff --git a/ghc/rts/HeapStackCheck.hc b/ghc/rts/HeapStackCheck.hc index 8f66e92..8d0c46a 100644 --- a/ghc/rts/HeapStackCheck.hc +++ b/ghc/rts/HeapStackCheck.hc @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: HeapStackCheck.hc,v 1.9 1999/08/25 16:11:48 simonmar Exp $ + * $Id: HeapStackCheck.hc,v 1.16 2001/03/23 16:36:21 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -7,6 +7,7 @@ * * ---------------------------------------------------------------------------*/ +#include "Stg.h" #include "Rts.h" #include "Storage.h" /* for CurrentTSO */ #include "StgRun.h" /* for StgReturn and register saving */ @@ -20,7 +21,7 @@ * * - If the context_switch flag is set, indicating that there are more * threads waiting to run, we yield to the scheduler - * (return ThreadYeilding). + * (return ThreadYielding). * * - If Hp > HpLim, we've had a heap check failure. This means we've * come to the end of the current heap block, so we try to chain @@ -64,7 +65,7 @@ R1.i = StackOverflow; \ } \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadRunGHC; \ + CurrentTSO->what_next = ThreadRunGHC; \ JMP_(StgReturn); #define GC_ENTER \ @@ -84,45 +85,46 @@ R1.i = StackOverflow; \ } \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadEnterGHC; \ + CurrentTSO->what_next = ThreadEnterGHC; \ JMP_(StgReturn); #define HP_GENERIC \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadRunGHC; \ + CurrentTSO->what_next = ThreadRunGHC; \ R1.i = HeapOverflow; \ JMP_(StgReturn); #define STK_GENERIC \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadRunGHC; \ + CurrentTSO->what_next = ThreadRunGHC; \ R1.i = StackOverflow; \ JMP_(StgReturn); #define YIELD_GENERIC \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadRunGHC; \ + CurrentTSO->what_next = ThreadRunGHC; \ R1.i = ThreadYielding; \ JMP_(StgReturn); -#define YIELD_TO_HUGS \ +#define YIELD_TO_INTERPRETER \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadEnterHugs; \ + CurrentTSO->what_next = ThreadEnterInterp; \ R1.i = ThreadYielding; \ JMP_(StgReturn); #define BLOCK_GENERIC \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadRunGHC; \ + CurrentTSO->what_next = ThreadRunGHC; \ R1.i = ThreadBlocked; \ JMP_(StgReturn); #define BLOCK_ENTER \ SaveThreadState(); \ - CurrentTSO->whatNext = ThreadEnterGHC;\ + CurrentTSO->what_next = ThreadEnterGHC;\ R1.i = ThreadBlocked; \ JMP_(StgReturn); + /* ----------------------------------------------------------------------------- Heap Checks -------------------------------------------------------------------------- */ @@ -159,6 +161,18 @@ EXTFUN(stg_gc_enter_1) FE_ } +EXTFUN(stg_gc_enter_1_hponly) +{ + FB_ + Sp -= 1; + Sp[0] = R1.w; + R1.i = HeapOverflow; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + JMP_(StgReturn); + FE_ +} + /*- 2 Regs--------------------------------------------------------------------*/ EXTFUN(stg_gc_enter_2) @@ -264,6 +278,334 @@ EXTFUN(stg_gc_enter_8) FE_ } +#if defined(GRAN) +/* + ToDo: merge the block and yield macros, calling something like BLOCK(N) + at the end; +*/ + +/* + Should we actually ever do a yield in such a case?? -- HWL +*/ +EXTFUN(gran_yield_0) +{ + FB_ + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +EXTFUN(gran_yield_1) +{ + FB_ + Sp -= 1; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 2 Regs--------------------------------------------------------------------*/ + +EXTFUN(gran_yield_2) +{ + FB_ + Sp -= 2; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 3 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_yield_3) +{ + FB_ + Sp -= 3; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 4 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_yield_4) +{ + FB_ + Sp -= 4; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 5 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_yield_5) +{ + FB_ + Sp -= 5; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 6 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_yield_6) +{ + FB_ + Sp -= 6; + Sp[5] = R6.w; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 7 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_yield_7) +{ + FB_ + Sp -= 7; + Sp[6] = R7.w; + Sp[5] = R6.w; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +/*- 8 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_yield_8) +{ + FB_ + Sp -= 8; + Sp[7] = R8.w; + Sp[6] = R7.w; + Sp[5] = R6.w; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadYielding; + JMP_(StgReturn); + FE_ +} + +// the same routines but with a block rather than a yield + +EXTFUN(gran_block_1) +{ + FB_ + Sp -= 1; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 2 Regs--------------------------------------------------------------------*/ + +EXTFUN(gran_block_2) +{ + FB_ + Sp -= 2; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 3 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_block_3) +{ + FB_ + Sp -= 3; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 4 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_block_4) +{ + FB_ + Sp -= 4; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 5 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_block_5) +{ + FB_ + Sp -= 5; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 6 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_block_6) +{ + FB_ + Sp -= 6; + Sp[5] = R6.w; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 7 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_block_7) +{ + FB_ + Sp -= 7; + Sp[6] = R7.w; + Sp[5] = R6.w; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +/*- 8 Regs -------------------------------------------------------------------*/ + +EXTFUN(gran_block_8) +{ + FB_ + Sp -= 8; + Sp[7] = R8.w; + Sp[6] = R7.w; + Sp[5] = R6.w; + Sp[4] = R5.w; + Sp[3] = R4.w; + Sp[2] = R3.w; + Sp[1] = R2.w; + Sp[0] = R1.w; + SaveThreadState(); + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +#endif + +#if 0 && defined(PAR) + +/* + Similar to stg_block_1 (called via StgMacro BLOCK_NP) but separates the + saving of the thread state from the actual jump via an StgReturn. + We need this separation because we call RTS routines in blocking entry codes + before jumping back into the RTS (see parallel/FetchMe.hc). +*/ + +EXTFUN(par_block_1_no_jump) +{ + FB_ + Sp -= 1; + Sp[0] = R1.w; + SaveThreadState(); + FE_ +} + +EXTFUN(par_jump) +{ + FB_ + CurrentTSO->what_next = ThreadEnterGHC; + R1.i = ThreadBlocked; + JMP_(StgReturn); + FE_ +} + +#endif + /* ----------------------------------------------------------------------------- For a case expression on a polymorphic or function-typed object, if the default branch (there can only be one branch) of the case fails @@ -836,11 +1178,11 @@ FN_(stg_yield_noregs) FE_ } -FN_(stg_yield_to_Hugs) +FN_(stg_yield_to_interpreter) { FB_ /* No need to save everything - no live registers */ - YIELD_TO_HUGS + YIELD_TO_INTERPRETER FE_ }