[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / runtime / storage / SM2s.lc
diff --git a/ghc/runtime/storage/SM2s.lc b/ghc/runtime/storage/SM2s.lc
deleted file mode 100644 (file)
index 953d8f3..0000000
+++ /dev/null
@@ -1,251 +0,0 @@
-***************************************************************************
-
-                           TWO SPACE COLLECTION
-
-***************************************************************************
-
-\begin{code}
-#if defined(GC2s)
-
-#define SCAV_REG_MAP
-#include "SMinternal.h"
-#include "SMcopying.h"
-#include "SMextn.h"
-
-REGDUMP(ScavRegDump);
-
-I_ semispace = 0;              /* 0 or 1 */
-semispaceData semispaceInfo[2]
-    = {{0,0}, {0,0}};
-
-P_ heap_space = 0;             /* Address of first word of slab 
-                                  of memory allocated for heap */
-
-P_ hp_start;           /* Value of Hp when reduction was resumed */
-
-
-rtsBool
-initHeap(smInfo * sm)
-{
-    if (heap_space == 0) { /* allocates if it doesn't already exist */
-
-       I_ semispaceSize = RTSflags.GcFlags.heapSize / 2;
-
-       /* Allocate the roots space */
-       sm->roots = (P_ *) stgMallocWords(SM_MAXROOTS, "initHeap (roots)");
-
-       /* Allocate the heap */
-       heap_space = (P_) stgMallocWords(RTSflags.GcFlags.heapSize + EXTRA_HEAP_WORDS,
-                                        "initHeap (heap)");
-    
-       /* Define the semi-spaces */
-       semispaceInfo[0].base = HEAP_FRAME_BASE(heap_space, semispaceSize);
-       semispaceInfo[1].base = HEAP_FRAME_BASE(heap_space + semispaceSize, semispaceSize);
-       semispaceInfo[0].lim = HEAP_FRAME_LIMIT(heap_space, semispaceSize);
-       semispaceInfo[1].lim = HEAP_FRAME_LIMIT(heap_space + semispaceSize, semispaceSize);
-
-       stat_init("TWOSPACE",
-                 " No of Roots  Caf   Caf    Astk   Bstk",
-                 "Astk Bstk Reg  No  bytes  bytes  bytes");
-    }
-
-    /* Initialise heap pointer and limit */
-    sm->hp = hp_start = semispaceInfo[semispace].base - 1;
-    sm->hardHpOverflowSize = 0;
-
-    if (! RTSflags.GcFlags.allocAreaSizeGiven) {
-       sm->hplim = semispaceInfo[semispace].lim;
-    } else {
-       sm->hplim = sm->hp + RTSflags.GcFlags.allocAreaSize;
-
-       RTSflags.GcFlags.minAllocAreaSize = 0; /* specified size takes precedence */
-
-       if (sm->hplim > semispaceInfo[semispace].lim) {
-           fprintf(stderr, "Not enough heap for requested alloc size\n");
-           return rtsFalse;
-       }
-    }
-
-    if (RTSflags.GcFlags.forceGC) {
-       if (sm->hplim > sm->hp + RTSflags.GcFlags.forcingInterval) {
-          sm->hplim = sm->hp + RTSflags.GcFlags.forcingInterval; 
-       } else {
-          RTSflags.GcFlags.forceGC = rtsFalse;
-         /* forcing GC has no effect, as semi-space is smaller than forcingInterval */ 
-       }
-    }
-
-    sm->CAFlist = NULL;
-
-#ifndef PAR
-    initExtensions( sm );
-#endif /* !PAR */
-
-    if (RTSflags.GcFlags.trace) {
-       fprintf(stderr, "TWO SPACE Heap: 0base, 0lim, 1base, 1lim\n                0x%lx, 0x%lx, 0x%lx, 0x%lx\n",
-               (W_) semispaceInfo[0].base, (W_) semispaceInfo[0].lim,
-               (W_) semispaceInfo[1].base, (W_) semispaceInfo[1].lim);
-       fprintf(stderr, "TWO SPACE Initial: space %ld, base 0x%lx, lim 0x%lx\n                         hp 0x%lx, hplim 0x%lx, free %lu\n",
-               semispace,
-               (W_) semispaceInfo[semispace].base,
-               (W_) semispaceInfo[semispace].lim,
-               (W_) sm->hp, (W_) sm->hplim, (W_) (sm->hplim - sm->hp) * sizeof(W_));
-    }
-
-    return rtsTrue; /* OK */
-}
-
-I_
-collectHeap(reqsize, sm, do_full_collection)
-    W_ reqsize;
-    smInfo *sm;
-    rtsBool do_full_collection; /* ignored */
-{
-    I_ free_space,     /* No of words of free space following GC */
-        alloc,                 /* Number of words allocated since last GC */
-       resident,       /* Number of words remaining after GC */
-        extra_caf_words,/* Extra words referenced from CAFs */
-        caf_roots,      /* Number of CAFs */
-        bstk_roots;     /* Number of update frames on B stack */
-
-    fflush(stdout);     /* Flush stdout at start of GC */
-    SAVE_REGS(&ScavRegDump); /* Save registers */
-
-#if defined(PROFILING)
-    if (interval_expired) { heap_profile_setup(); }
-#endif  /* PROFILING */
-  
-    if (RTSflags.GcFlags.trace)
-       fprintf(stderr, "TWO SPACE Start: space %ld, base 0x%lx, lim 0x%lx\n                         hp 0x%lx, hplim 0x%lx, req %lu\n",
-               semispace, (W_) semispaceInfo[semispace].base,
-               (W_) semispaceInfo[semispace].lim,
-               (W_) sm->hp, (W_) sm->hplim, reqsize * sizeof(W_));
-
-    alloc = sm->hp - hp_start;
-    stat_startGC(alloc);
-
-    /* Set Up For Collecting:
-         - Flip Spaces
-        - Set ToHp to point one below bottom of to-space (last allocated)
-        - Set CAFs to Evac & Upd
-     */
-
-    semispace = NEXT_SEMI_SPACE(semispace);
-    ToHp = semispaceInfo[semispace].base - 1;
-    Scav = semispaceInfo[semispace].base;
-    
-    SetCAFInfoTables( sm->CAFlist );
-#ifdef PAR
-    EvacuateLocalGAs(rtsTrue);
-#else
-    /* evacSPTable( sm ); stable pointers now reachable via sm->roots */
-#endif /* PAR */
-    EvacuateRoots( sm->roots, sm->rootno );
-#if defined(GRAN)
-    EvacuateEvents();
-#endif
-#if defined(CONCURRENT)
-    EvacuateSparks();
-#endif
-#if !defined(PAR) /* && !defined(GRAN) */
-    EvacuateAStack( MAIN_SpA, stackInfo.botA );
-    EvacuateBStack( MAIN_SuB, stackInfo.botB, &bstk_roots );
-#endif /* !PAR */
-
-    Scavenge();
-
-    EvacAndScavengeCAFs( sm->CAFlist, &extra_caf_words, &caf_roots );
-
-#ifdef PAR
-    RebuildGAtables(rtsTrue);
-#else
-    reportDeadForeignObjs(sm->ForeignObjList, NULL, &(sm->ForeignObjList) );
-#endif /* PAR */
-
-    /* TIDY UP AND RETURN */
-
-    sm->hp = hp_start = ToHp;  /* Last allocated word */
-
-    resident = sm->hp - (semispaceInfo[semispace].base - 1);
-    DO_MAX_RESIDENCY(resident); /* stats only */
-
-    if (! RTSflags.GcFlags.allocAreaSizeGiven) {
-       sm->hplim = semispaceInfo[semispace].lim;
-       free_space = sm->hplim - sm->hp;
-    } else {
-       sm->hplim = sm->hp + RTSflags.GcFlags.allocAreaSize;
-       if (sm->hplim > semispaceInfo[semispace].lim) {
-           free_space = 0;
-       } else {
-           free_space = RTSflags.GcFlags.allocAreaSize;
-       }
-    }
-
-    if (RTSflags.GcFlags.giveStats) {
-       char comment_str[BIG_STRING_LEN];
-#ifndef PAR
-       sprintf(comment_str, "%4u %4ld %3ld %3ld %6lu %6lu %6lu",
-               (SUBTRACT_A_STK(MAIN_SpA, stackInfo.botA) + 1),
-               bstk_roots, sm->rootno,
-               caf_roots, extra_caf_words*sizeof(W_),
-               (SUBTRACT_A_STK(MAIN_SpA, stackInfo.botA) + 1)*sizeof(W_),
-               (SUBTRACT_B_STK(MAIN_SpB, stackInfo.botB) + 1)*sizeof(W_));
-#else
-       /* ToDo: come up with some interesting statistics for the parallel world */
-       sprintf(comment_str, "%4u %4ld %3ld %3ld %6lu %6lu %6lu",
-               0, 0, sm->rootno, caf_roots, extra_caf_words*sizeof(W_), 0, 0);
-#endif
-
-#if defined(PROFILING)
-       if (interval_expired) { strcat(comment_str, " prof"); }
-#endif
-
-       stat_endGC(alloc, RTSflags.GcFlags.heapSize, resident, comment_str);
-    } else {
-       stat_endGC(alloc, RTSflags.GcFlags.heapSize, resident, "");
-    }
-
-#if defined(PROFILING) || defined(PAR)
-      if (interval_expired) {
-#if defined(PROFILING)
-         heap_profile_done();
-#endif
-         report_cc_profiling(0 /*partial*/);
-      }
-#endif /* PROFILING */
-
-    if (RTSflags.GcFlags.trace)
-       fprintf(stderr, "TWO SPACE Done: space %ld, base 0x%lx, lim 0x%lx\n                         hp 0x%lx, hplim 0x%lx, free %lu\n",
-               semispace, (W_) semispaceInfo[semispace].base,
-               (W_) semispaceInfo[semispace].lim,
-               (W_) sm->hp, (W_) sm->hplim, (W_) (free_space * sizeof(W_)));
-
-#ifdef DEBUG
-    /* To help flush out bugs, we trash the part of the heap from
-       which we're about to start allocating and all of the other semispace. */
-    TrashMem(sm->hp+1, sm->hplim);
-    TrashMem(semispaceInfo[NEXT_SEMI_SPACE(semispace)].base, 
-            semispaceInfo[NEXT_SEMI_SPACE(semispace)].lim);
-#endif /* DEBUG */
-
-    RESTORE_REGS(&ScavRegDump);     /* Restore Registers */
-
-    if (free_space < RTSflags.GcFlags.minAllocAreaSize || free_sapce < reqsize)
-      return( GC_HARD_LIMIT_EXCEEDED );        /* Heap absolutely exhausted */
-
-    else {
-       if (RTSflags.GcFlags.forceGC
-        && sm->hplim > sm->hp + RTSflags.GcFlags.forcingInterval) {
-             sm->hplim = sm->hp + RTSflags.GcFlags.forcingInterval;
-       }
-
-       if (reqsize + sm->hardHpOverflowSize > free_space) {
-           return( GC_SOFT_LIMIT_EXCEEDED );   /* Heap nearly exhausted */
-       } else {
-           return( GC_SUCCESS );                   /* Heap OK */
-       }
-    }
-}
-
-#endif /* GC2s */
-\end{code}