/* -----------------------------------------------------------------------------
- * $Id: PrimOps.hc,v 1.43 2000/02/28 13:59:43 simonmar Exp $
+ * $Id: PrimOps.hc,v 1.53 2000/08/07 23:37:23 qrczak Exp $
*
- * (c) The GHC Team, 1998-1999
+ * (c) The GHC Team, 1998-2000
*
* Primitive functions / data
*
#include "StablePriv.h"
#include "HeapStackCheck.h"
#include "StgRun.h"
+#include "Itimer.h"
+#include "Prelude.h"
/* ** temporary **
FE_ \
}
-newByteArray(Char, sizeof(C_))
-newByteArray(Int, sizeof(I_));
-newByteArray(Word, sizeof(W_));
-newByteArray(Addr, sizeof(P_));
-newByteArray(Float, sizeof(StgFloat));
-newByteArray(Double, sizeof(StgDouble));
-newByteArray(StablePtr, sizeof(StgStablePtr));
+newByteArray(Char, 1)
+/* Char arrays really contain only 8-bit bytes for compatibility. */
+newByteArray(Int, sizeof(I_))
+newByteArray(Word, sizeof(W_))
+newByteArray(Addr, sizeof(P_))
+newByteArray(Float, sizeof(StgFloat))
+newByteArray(Double, sizeof(StgDouble))
+newByteArray(StablePtr, sizeof(StgStablePtr))
FN_(newArrayzh_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 */
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;
#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;
/* 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);