예제 #1
0
파일: Storage.c 프로젝트: alexbiehl/ghc
void storageAddCapabilities (uint32_t from, uint32_t to)
{
    uint32_t n, g, i, new_n_nurseries;

    if (RtsFlags.GcFlags.nurseryChunkSize == 0) {
        new_n_nurseries = to;
    } else {
        memcount total_alloc = to * RtsFlags.GcFlags.minAllocAreaSize;
        new_n_nurseries =
            stg_max(to, total_alloc / RtsFlags.GcFlags.nurseryChunkSize);
    }

    if (from > 0) {
        nurseries = stgReallocBytes(nurseries,
                                    new_n_nurseries * sizeof(struct nursery_),
                                    "storageAddCapabilities");
    } else {
        nurseries = stgMallocBytes(new_n_nurseries * sizeof(struct nursery_),
                                   "storageAddCapabilities");
    }

    // we've moved the nurseries, so we have to update the rNursery
    // pointers from the Capabilities.
    for (i = 0; i < to; i++) {
        capabilities[i]->r.rNursery = &nurseries[i];
    }

    /* The allocation area.  Policy: keep the allocation area
     * small to begin with, even if we have a large suggested heap
     * size.  Reason: we're going to do a major collection first, and we
     * don't want it to be a big one.  This vague idea is borne out by
     * rigorous experimental evidence.
     */
    allocNurseries(n_nurseries, new_n_nurseries);
    n_nurseries = new_n_nurseries;

    /*
     * Assign each of the new capabilities a nursery.  Remember to start from
     * next_nursery, because we may have already consumed some of the earlier
     * nurseries.
     */
    assignNurseriesToCapabilities(from,to);

    // allocate a block for each mut list
    for (n = from; n < to; n++) {
        for (g = 1; g < RtsFlags.GcFlags.generations; g++) {
            capabilities[n]->mut_lists[g] =
                allocBlockOnNode(capNoToNumaNode(n));
        }
    }

#if defined(THREADED_RTS) && defined(llvm_CC_FLAVOR) && (CC_SUPPORTS_TLS == 0)
    newThreadLocalKey(&gctKey);
#endif

    initGcThreads(from, to);
}
예제 #2
0
파일: Storage.c 프로젝트: Chobbes/ghc
static void
allocNurseries (nat from, nat to)
{ 
    nat i;

    for (i = from; i < to; i++) {
        nurseries[i].blocks =
            allocNursery(NULL, RtsFlags.GcFlags.minAllocAreaSize);
        nurseries[i].n_blocks =
            RtsFlags.GcFlags.minAllocAreaSize;
    }
    assignNurseriesToCapabilities(from, to);
}
예제 #3
0
파일: Storage.c 프로젝트: LeapYear/ghc
void
resetNurseries (void)
{
    next_nursery = 0;
    assignNurseriesToCapabilities(0, n_capabilities);

#ifdef DEBUG
    bdescr *bd;
    nat n;
    for (n = 0; n < n_nurseries; n++) {
        for (bd = nurseries[n].blocks; bd; bd = bd->link) {
            ASSERT(bd->gen_no == 0);
            ASSERT(bd->gen == g0);
            IF_DEBUG(sanity, memset(bd->start, 0xaa, BLOCK_SIZE));
        }
    }
#endif
}
예제 #4
0
파일: Storage.c 프로젝트: Chobbes/ghc
void
resetNurseries (void)
{
    assignNurseriesToCapabilities(0, n_capabilities);
}