[project @ 2005-04-10 21:44:10 by simonmar]
[ghc-hetmet.git] / ghc / rts / Storage.c
index 45d94ae..14e4444 100644 (file)
 #include "Weak.h"
 #include "Sanity.h"
 #include "Arena.h"
-
+#include "OSThreads.h"
+#include "Capability.h"
 #include "Storage.h"
 #include "Schedule.h"
-#include "OSThreads.h"
-
 #include "RetainerProfile.h"   // for counting memory blocks (memInventory)
 
 #include <stdlib.h>
@@ -61,6 +60,18 @@ static void *stgAllocForGMP   (size_t size_in_bytes);
 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
+
 void
 initStorage( void )
 {
@@ -335,19 +346,12 @@ allocNurseries( void )
 { 
 #ifdef SMP
   Capability *cap;
-  bdescr *bd;
 
   g0s0->blocks = NULL;
   g0s0->n_blocks = 0;
   for (cap = free_capabilities; cap != NULL; cap = cap->link) {
     cap->r.rNursery = allocNursery(NULL, RtsFlags.GcFlags.minAllocAreaSize);
     cap->r.rCurrentNursery = cap->r.rNursery;
-    /* Set the back links to be equal to the Capability,
-     * so we can do slightly better informed locking.
-     */
-    for (bd = cap->r.rNursery; bd != NULL; bd = bd->link) {
-      bd->u.back = (bdescr *)cap;
-    }
   }
 #else /* SMP */
   g0s0->blocks      = allocNursery(NULL, RtsFlags.GcFlags.minAllocAreaSize);
@@ -364,13 +368,17 @@ void
 resetNurseries( void )
 {
   bdescr *bd;
-#ifdef SMP
   Capability *cap;
-  
-  /* All tasks must be stopped */
-  ASSERT(n_free_capabilities == RtsFlags.ParFlags.nNodes);
 
-  for (cap = free_capabilities; cap != NULL; cap = cap->link) {
+#ifdef SMP
+  /* All tasks must be stopped */
+  ASSERT(rts_n_free_capabilities == RtsFlags.ParFlags.nNodes);
+  for (cap = free_capabilities; cap != NULL; cap = cap->link)
+#else
+  cap = &MainCapability;
+  ASSERT(cap->r.rNursery == g0s0->blocks);
+#endif
+  {
     for (bd = cap->r.rNursery; bd; bd = bd->link) {
       bd->free = bd->start;
       ASSERT(bd->gen_no == 0);
@@ -379,16 +387,6 @@ resetNurseries( void )
     }
     cap->r.rCurrentNursery = cap->r.rNursery;
   }
-#else
-  for (bd = g0s0->blocks; bd; bd = bd->link) {
-    bd->free = bd->start;
-    ASSERT(bd->gen_no == 0);
-    ASSERT(bd->step == g0s0);
-    IF_DEBUG(sanity,memset(bd->start, 0xaa, BLOCK_SIZE));
-  }
-  MainCapability.r.rNursery = g0s0->blocks;
-  MainCapability.r.rCurrentNursery = g0s0->blocks;
-#endif
 }
 
 bdescr *
@@ -468,6 +466,8 @@ resizeNursery ( nat blocks )
   
   g0s0->n_blocks = blocks;
   ASSERT(countBlocks(g0s0->blocks) == g0s0->n_blocks);
+
+  MainCapability.r.rNursery = g0s0->blocks;
 }
 
 /* -----------------------------------------------------------------------------
@@ -695,7 +695,7 @@ calcAllocated( void )
   /*  ASSERT(n_free_capabilities == RtsFlags.ParFlags.nNodes); */
 
   allocated = 
-    n_free_capabilities * RtsFlags.GcFlags.minAllocAreaSize * BLOCK_SIZE_W
+    rts_n_free_capabilities * RtsFlags.GcFlags.minAllocAreaSize * BLOCK_SIZE_W
     + allocated_bytes();
 
   for (cap = free_capabilities; cap != NULL; cap = cap->link) {