/* -----------------------------------------------------------------------------
- * $Id: StgMiscClosures.hc,v 1.32 2000/01/14 11:45:21 hwloidl Exp $
+ * $Id: StgMiscClosures.hc,v 1.33 2000/01/14 13:22:21 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
#endif
#ifdef SMP
- CMPXCHG(R1.cl->header.info, &BLACKHOLE_info, &WHITEHOLE_info);
+ {
+ bdescr *bd = Bdescr(R1.p);
+ if (bd->back != (bdescr *)BaseReg) {
+ if (bd->gen->no >= 1 || bd->step->no >= 1) {
+ CMPXCHG(R1.cl->header.info, &BLACKHOLE_info, &WHITEHOLE_info);
+ } else {
+ EXTFUN_RTS(stg_gc_enter_1_hponly);
+ JMP_(stg_gc_enter_1_hponly);
+ }
+ }
+ }
#endif
-
TICK_ENT_BH();
/* Put ourselves on the blocking queue for this black hole */
#endif
#ifdef SMP
- CMPXCHG(R1.cl->header.info, &BLACKHOLE_BQ_info, &WHITEHOLE_info);
+ {
+ bdescr *bd = Bdescr(R1.p);
+ if (bd->back != (bdescr *)BaseReg) {
+ if (bd->gen->no >= 1 || bd->step->no >= 1) {
+ CMPXCHG(R1.cl->header.info, &BLACKHOLE_info, &WHITEHOLE_info);
+ } else {
+ EXTFUN_RTS(stg_gc_enter_1_hponly);
+ JMP_(stg_gc_enter_1_hponly);
+ }
+ }
+ }
#endif
TICK_ENT_BH();
#endif
#ifdef SMP
- CMPXCHG(R1.cl->header.info, &CAF_BLACKHOLE_info, &WHITEHOLE_info);
+ {
+ bdescr *bd = Bdescr(R1.p);
+ if (bd->back != (bdescr *)BaseReg) {
+ if (bd->gen->no >= 1 || bd->step->no >= 1) {
+ CMPXCHG(R1.cl->header.info, &CAF_BLACKHOLE_info, &WHITEHOLE_info);
+ } else {
+ EXTFUN_RTS(stg_gc_enter_1_hponly);
+ JMP_(stg_gc_enter_1_hponly);
+ }
+ }
+ }
#endif
TICK_ENT_BH();