示例#1
0
文件: Storage.c 项目: LeapYear/ghc
/*
 * Give each Capability a nursery from the pool. No need to do atomic increments
 * here, everything must be stopped to call this function.
 */
static void
assignNurseriesToCapabilities (nat from, nat to)
{
    nat i;

    for (i = from; i < to; i++) {
        assignNurseryToCapability(capabilities[i], next_nursery++);
    }
}
示例#2
0
文件: Storage.c 项目: adgalad/ghc
/*
 * Give each Capability a nursery from the pool. No need to do atomic increments
 * here, everything must be stopped to call this function.
 */
static void
assignNurseriesToCapabilities (uint32_t from, uint32_t to)
{
    uint32_t i;

    for (i = from; i < to; i++) {
        assignNurseryToCapability(capabilities[i], next_nursery++);
    }
}
示例#3
0
文件: Storage.c 项目: ForkBackups/ghc
rtsBool
getNewNursery (Capability *cap)
{
    StgWord i = atomic_inc(&next_nursery, 1) - 1;
    if (i >= n_nurseries) {
        return rtsFalse;
    }
    assignNurseryToCapability(cap, i);
    return rtsTrue;
}
示例#4
0
文件: Storage.c 项目: alexbiehl/ghc
/*
 * Give each Capability a nursery from the pool. No need to do atomic increments
 * here, everything must be stopped to call this function.
 */
static void
assignNurseriesToCapabilities (uint32_t from, uint32_t to)
{
    uint32_t i, node;

    for (i = from; i < to; i++) {
        node = capabilities[i]->node;
        assignNurseryToCapability(capabilities[i], next_nursery[node]);
        next_nursery[node] += n_numa_nodes;
    }
}
示例#5
0
文件: Storage.c 项目: alexbiehl/ghc
bool
getNewNursery (Capability *cap)
{
    StgWord i;
    uint32_t node = cap->node;
    uint32_t n;

    for(;;) {
        i = next_nursery[node];
        if (i < n_nurseries) {
            if (cas(&next_nursery[node], i, i+n_numa_nodes) == i) {
                assignNurseryToCapability(cap, i);
                return true;
            }
        } else if (n_numa_nodes > 1) {
            // Try to find an unused nursery chunk on other nodes.  We'll get
            // remote memory, but the rationale is that avoiding GC is better
            // than avoiding remote memory access.
            bool lost = false;
            for (n = 0; n < n_numa_nodes; n++) {
                if (n == node) continue;
                i = next_nursery[n];
                if (i < n_nurseries) {
                    if (cas(&next_nursery[n], i, i+n_numa_nodes) == i) {
                        assignNurseryToCapability(cap, i);
                        return true;
                    } else {
                        lost = true; /* lost a race */
                    }
                }
            }
            if (!lost) return false;
        } else {
            return false;
        }
    }
}
示例#6
0
文件: Storage.c 项目: LeapYear/ghc
rtsBool
getNewNursery (Capability *cap)
{
    StgWord i;

    for(;;) {
        i = next_nursery;
        if (i >= n_nurseries) {
            return rtsFalse;
        }
        if (cas(&next_nursery, i, i+1) == i) {
            assignNurseryToCapability(cap, i);
            return rtsTrue;
        }
    }
}