X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fruntime%2Fstorage%2FSM2s.lc;fp=ghc%2Fruntime%2Fstorage%2FSM2s.lc;h=0000000000000000000000000000000000000000;hb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;hp=953d8f393bcb624252217cb55b050907c4fa1af0;hpb=967cc47f37cb93a5e2b6df7822c9a646f0428247;p=ghc-hetmet.git diff --git a/ghc/runtime/storage/SM2s.lc b/ghc/runtime/storage/SM2s.lc deleted file mode 100644 index 953d8f3..0000000 --- a/ghc/runtime/storage/SM2s.lc +++ /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}