/* -----------------------------------------------------------------------------
- * $Id: GC.c,v 1.141 2002/09/10 10:43:52 simonmar Exp $
+ * $Id: GC.c,v 1.145 2002/10/25 09:40:47 simonmar Exp $
*
* (c) The GHC Team 1998-1999
*
#include "Prelude.h"
#include "ParTicky.h" // ToDo: move into Rts.h
#include "GCCompact.h"
+#include "Signals.h"
#if defined(GRAN) || defined(PAR)
# include "GranSimRts.h"
# include "ParallelRts.h"
Now, Now));
#endif
+#ifndef mingw32_TARGET_OS
+ // block signals
+ blockUserSignals();
+#endif
+
// tell the stats department that we've started a GC
stat_startGC();
// ok, GC over: tell the stats department what happened.
stat_endGC(allocated, collected, live, copied, N);
+#ifndef mingw32_TARGET_OS
+ // unblock signals again
+ unblockUserSignals();
+#endif
+
//PAR_TICKY_TP();
}
if (LOOKS_LIKE_STATIC(p) || bd->gen_no > N) {
return p;
}
- // large objects have an evacuated flag
+
+ // if it's a pointer into to-space, then we're done
+ if (bd->flags & BF_EVACUATED) {
+ return p;
+ }
+
+ // large objects use the evacuated flag
if (bd->flags & BF_LARGE) {
- if (bd->flags & BF_EVACUATED) {
- return p;
- } else {
- return NULL;
- }
+ return NULL;
}
+
// check the mark bit for compacted steps
if (bd->step->is_compacted && is_marked((P_)p,bd)) {
return p;
static __inline__ void
upd_evacuee(StgClosure *p, StgClosure *dest)
{
- p->header.info = &stg_EVACUATED_info;
- ((StgEvacuated *)p)->evacuee = dest;
+ // Source object must be in from-space:
+ ASSERT((Bdescr((P_)p)->flags & BF_EVACUATED) == 0);
+ // not true: (ToDo: perhaps it should be)
+ // ASSERT(Bdescr((P_)dest)->flags & BF_EVACUATED);
+ p->header.info = &stg_EVACUATED_info;
+ ((StgEvacuated *)p)->evacuee = dest;
}
return selectee->payload[field];
case IND:
- case IND_STATIC:
case IND_PERM:
case IND_OLDGEN:
case IND_OLDGEN_PERM:
// leaks by evaluating this selector thunk anyhow.
break;
+ case IND_STATIC:
+ // We can't easily tell whether the indirectee is into
+ // from or to-space, so just bail out here.
+ break;
+
case THUNK_SELECTOR:
{
StgClosure *val;