X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FPrimOps.hc;h=e288b328b7263825ac39c0b2d2f5e3d59fe81906;hb=e1ecea726f8fb3dc180c8aba8222f6c9e9823c47;hp=709947a8289ef1d9860418abe8188b1efb4e4f6b;hpb=187e9eb5708fa2a751a4b1f8abf54ff93d7049d6;p=ghc-hetmet.git diff --git a/ghc/rts/PrimOps.hc b/ghc/rts/PrimOps.hc index 709947a..e288b32 100644 --- a/ghc/rts/PrimOps.hc +++ b/ghc/rts/PrimOps.hc @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- - * $Id: PrimOps.hc,v 1.43 2000/02/28 13:59:43 simonmar Exp $ + * $Id: PrimOps.hc,v 1.52 2000/05/10 11:02:00 simonmar Exp $ * - * (c) The GHC Team, 1998-1999 + * (c) The GHC Team, 1998-2000 * * Primitive functions / data * @@ -19,6 +19,8 @@ #include "StablePriv.h" #include "HeapStackCheck.h" #include "StgRun.h" +#include "Itimer.h" +#include "Prelude.h" /* ** temporary ** @@ -322,14 +324,14 @@ FN_(newMutVarzh_fast) -------------------------------------------------------------------------- */ #ifndef PAR -FN_(makeForeignObjzh_fast) +FN_(mkForeignObjzh_fast) { /* R1.p = ptr to foreign object, */ StgForeignObj *result; FB_ - HP_CHK_GEN_TICKY(sizeofW(StgForeignObj), NO_PTRS, makeForeignObjzh_fast,); + HP_CHK_GEN_TICKY(sizeofW(StgForeignObj), NO_PTRS, mkForeignObjzh_fast,); TICK_ALLOC_PRIM(sizeofW(StgHeader), sizeofW(StgForeignObj)-sizeofW(StgHeader), 0); CCS_ALLOC(CCCS,sizeofW(StgForeignObj)); /* ccs prof */ @@ -886,6 +888,47 @@ FN_(takeMVarzh_fast) FE_ } +FN_(tryTakeMVarzh_fast) +{ + StgMVar *mvar; + StgClosure *val; + const StgInfoTable *info; + + FB_ + /* args: R1 = MVar closure */ + + mvar = (StgMVar *)R1.p; + +#ifdef SMP + info = LOCK_CLOSURE(mvar); +#else + info = GET_INFO(mvar); +#endif + + if (info == &EMPTY_MVAR_info) { + +#ifdef SMP + /* unlock the MVar */ + mvar->header.info = &EMPTY_MVAR_info; +#endif + + /* HACK: we need a pointer to pass back, so we abuse NO_FINALIZER_closure */ + RET_NP(0, &NO_FINALIZER_closure); + } + + val = mvar->value; + mvar->value = (StgClosure *)&END_TSO_QUEUE_closure; + + /* do this last... we might have locked the MVar in the SMP case, + * and writing the info pointer will unlock it. + */ + SET_INFO(mvar,&EMPTY_MVAR_info); + + TICK_RET_UNBOXED_TUP(1); + RET_NP(1,val); + FE_ +} + FN_(putMVarzh_fast) { StgMVar *mvar; @@ -903,7 +946,13 @@ FN_(putMVarzh_fast) #endif if (info == &FULL_MVAR_info) { - barf("putMVar#: MVar already full"); +#ifdef INTERPRETER + fprintf(stderr, "fatal: put on a full MVar in Hugs; aborting\n" ); + exit(1); +#else + R1.cl = (StgClosure *)PutFullMVar_closure; + JMP_(raisezh_fast); +#endif } mvar->value = R2.cl; @@ -1009,7 +1058,11 @@ FN_(delayzh_fast) /* Add on ticks_since_select, since these will be subtracted at * the next awaitEvent call. */ +#if defined(HAVE_SETITIMER) || defined(mingw32_TARGET_OS) CurrentTSO->block_info.delay = R1.i + ticks_since_select; +#else + CurrentTSO->block_info.target = R1.i + getourtimeofday(); +#endif APPEND_TO_BLOCKED_QUEUE(CurrentTSO);