/* -----------------------------------------------------------------------------
- * $Id: PrimOps.hc,v 1.46 2000/03/14 09:55:05 simonmar Exp $
+ * $Id: PrimOps.hc,v 1.51 2000/04/12 17:11:38 simonmar Exp $
*
* (c) The GHC Team, 1998-2000
*
#include "StablePriv.h"
#include "HeapStackCheck.h"
#include "StgRun.h"
+#include "Itimer.h"
#include "Prelude.h"
/* ** temporary **
-------------------------------------------------------------------------- */
#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 */
FE_
}
+FN_(takeMaybeMVarzh_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;
/* 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);