oops, initialize atomic_modify_mutvar_mutex
[ghc-hetmet.git] / ghc / rts / Storage.c
index b6fab58..4933854 100644 (file)
@@ -51,14 +51,19 @@ ullong total_allocated = 0; /* total memory allocated during run */
 nat n_nurseries         = 0;    /* == RtsFlags.ParFlags.nNodes, convenience */
 step *nurseries         = NULL; /* array of nurseries, >1 only if THREADED_RTS */
 
+#ifdef THREADED_RTS
 /*
  * Storage manager mutex:  protects all the above state from
  * simultaneous access by two STG threads.
  */
-#ifdef THREADED_RTS
 Mutex sm_mutex;
+/*
+ * This mutex is used by atomicModifyMutVar# only
+ */
+Mutex atomic_modify_mutvar_mutex;
 #endif
 
+
 /*
  * Forward references
  */
@@ -127,6 +132,7 @@ initStorage( void )
   
 #if defined(THREADED_RTS)
   initMutex(&sm_mutex);
+  initMutex(&atomic_modify_mutvar_mutex);
 #endif
 
   ACQUIRE_SM_LOCK;
@@ -769,9 +775,11 @@ void
 dirty_MUT_VAR(StgRegTable *reg, StgClosure *p)
 {
     Capability *cap = regTableToCapability(reg);
+    bdescr *bd;
     if (p->header.info == &stg_MUT_VAR_CLEAN_info) {
        p->header.info = &stg_MUT_VAR_DIRTY_info;
-       recordMutableCap(p,cap,Bdescr(p)->gen_no);
+       bd = Bdescr((StgPtr)p);
+       if (bd->gen_no > 0) recordMutableCap(p,cap,bd->gen_no);
     }
 }