/* * 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++); } }
/* * 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++); } }
rtsBool getNewNursery (Capability *cap) { StgWord i = atomic_inc(&next_nursery, 1) - 1; if (i >= n_nurseries) { return rtsFalse; } assignNurseryToCapability(cap, i); return rtsTrue; }
/* * 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; } }
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; } } }
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; } } }