static void *stgReallocForGMP (void *ptr, size_t old_size, size_t new_size);
static void stgDeallocForGMP (void *ptr, size_t size);
-/*
- * Storage manager mutex
- */
-#if defined(SMP)
-extern Mutex sm_mutex;
-#define ACQUIRE_SM_LOCK ACQUIRE_LOCK(&sm_mutex)
-#define RELEASE_SM_LOCK RELEASE_LOCK(&sm_mutex)
-#else
-#define ACQUIRE_SM_LOCK
-#define RELEASE_SM_LOCK
-#endif
-
static void
initStep (step *stp, int g, int s)
{
errorBelch("-G1 is incompatible with SMP");
stg_exit(1);
}
- // No -H, for now
- if (RtsFlags.GcFlags.heapSizeSuggestion > 0) {
- errorBelch("-H<size> is incompatible with SMP");
- stg_exit(1);
- }
#endif
/* generation 0 is special: that's the nursery */
// Resize each of the nurseries to the specified size.
//
void
-resizeNurseries (nat blocks)
+resizeNurseriesFixed (nat blocks)
{
nat i;
for (i = 0; i < n_nurseries; i++) {
}
}
+//
+// Resize the nurseries to the total specified size.
+//
+void
+resizeNurseries (nat blocks)
+{
+ // If there are multiple nurseries, then we just divide the number
+ // of available blocks between them.
+ resizeNurseriesFixed(blocks / n_nurseries);
+}
+
/* -----------------------------------------------------------------------------
The allocate() interface
#ifdef SMP
for (i = 0; i < n_nurseries; i++) {
Capability *cap;
- for ( bd = capabilities[i].r.rCurrentNursery;
+ for ( bd = capabilities[i].r.rCurrentNursery->link;
bd != NULL; bd = bd->link ) {
allocated -= BLOCK_SIZE_W;
}
}
for (s = 0; s < n_nurseries; s++) {
- ASSERT(countBlocks(generations[g].steps[s].blocks)
- == generations[g].steps[s].n_blocks);
- ASSERT(countBlocks(generations[g].steps[s].large_objects)
- == generations[g].steps[s].n_large_blocks);
+ ASSERT(countBlocks(nurseries[s].blocks)
+ == nurseries[s].n_blocks);
+ ASSERT(countBlocks(nurseries[s].large_objects)
+ == nurseries[s].n_large_blocks);
}
checkFreeListSanity();