/* ----------------------------------------------------------------------------
- * $Id: RtsAPI.c,v 1.12 2000/03/14 09:55:05 simonmar Exp $
+ * $Id: RtsAPI.c,v 1.20 2000/08/29 13:34:21 qrczak Exp $
*
* (c) The GHC Team, 1998-2000
*
Building Haskell objects from C datatypes.
------------------------------------------------------------------------- */
HaskellObj
-rts_mkChar (char c)
+rts_mkChar (unsigned int c)
{
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,1));
p->header.info = Czh_con_info;
- p->payload[0] = (StgClosure *)((StgInt)c);
+ p->payload[0] = (StgClosure *)(StgChar)c;
return p;
}
}
HaskellObj
-rts_mkInt64 (long long int i)
+rts_mkInt64 (HsInt64_ i)
{
long long *tmp;
StgClosure *p = (StgClosure *)allocate(CONSTR_sizeW(0,2));
}
HaskellObj
-rts_mkWord64 (unsigned long long w)
+rts_mkWord64 (HsWord64_ w)
{
unsigned long long *tmp;
#ifdef COMPILER /* GHC has em, Hugs doesn't */
HaskellObj
-rts_mkBool (int b)
+rts_mkBool (StgBool b)
{
if (b) {
return (StgClosure *)True_closure;
rts_apply (HaskellObj f, HaskellObj arg)
{
StgAP_UPD *ap = (StgAP_UPD *)allocate(AP_sizeW(1));
- ap->header.info = &AP_UPD_info;
+ SET_HDR(ap, &AP_UPD_info, CCS_SYSTEM);
ap->n_args = 1;
ap->fun = f;
- ap->payload[0] = (P_)arg;
+ ap->payload[0] = arg;
return (StgClosure *)ap;
}
Deconstructing Haskell objects
------------------------------------------------------------------------- */
-char
+unsigned int
rts_getChar (HaskellObj p)
{
if ( p->header.info == Czh_con_info ||
p->header.info == Czh_static_info) {
- return (char)(StgWord)(p->payload[0]);
+ return (StgChar)(StgWord)(p->payload[0]);
} else {
barf("getChar: not a Char");
}
return waitThread(tso, ret);
}
-/* Convenience function for decoding the returned status. */
+#if defined(PAR) || defined(SMP)
+/*
+ Needed in the parallel world for non-Main PEs, which do not get a piece
+ of work to start with --- they have to humbly ask for it
+*/
-void rts_checkSchedStatus ( char* site, SchedulerStatus rc )
+SchedulerStatus
+rts_evalNothing(unsigned int stack_size)
{
- if ( rc == Success ) {
- return;
- } else {
- barf("%s: Return code (%d) not ok",(site),(rc));
- }
+ /* ToDo: propagate real SchedulerStatus back to caller */
+ scheduleThread(END_TSO_QUEUE);
+ return Success;
+}
+#endif
+
+/* Convenience function for decoding the returned status. */
+
+void
+rts_checkSchedStatus ( char* site, SchedulerStatus rc )
+{
+ switch (rc) {
+ case Success:
+ return;
+ case Killed:
+ barf("%s: uncaught exception",site);
+ case Interrupted:
+ barf("%s: interrupted", site);
+ case Deadlock:
+ barf("%s: no threads to run: infinite loop or deadlock?", site);
+ default:
+ barf("%s: Return code (%d) not ok",(site),(rc));
+ }
}