summaryrefslogtreecommitdiff
path: root/rts/sm
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-12-31 16:02:23 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-12-31 16:02:23 +0000
commit5178da7f966c810c3d64fee02c1161406f9ac1d2 (patch)
treeb9a6235fe97ff0d8e10e152b4923ae498b87c587 /rts/sm
parentbfe90953c7700efb3b62a7c63a823608add077b8 (diff)
downloadhaskell-5178da7f966c810c3d64fee02c1161406f9ac1d2.tar.gz
take newCAF() out from sm_mutex; use the capability-local mut list instead
Diffstat (limited to 'rts/sm')
-rw-r--r--rts/sm/Storage.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index 781234a72d..1f875a9b64 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -94,7 +94,7 @@ initGeneration (generation *gen, int g)
void
initStorage( void )
{
- nat g;
+ nat g, n;
if (generations != NULL) {
// multi-init protection
@@ -192,6 +192,13 @@ initStorage( void )
N = 0;
+ // allocate a block for each mut list
+ for (n = 0; n < n_capabilities; n++) {
+ for (g = 1; g < RtsFlags.GcFlags.generations; g++) {
+ capabilities[n].mut_lists[g] = allocBlock();
+ }
+ }
+
initGcThreads();
IF_DEBUG(gc, statDescribeGens());
@@ -234,8 +241,8 @@ freeStorage (void)
newCaf() does the following:
- - it puts the CAF on the oldest generation's mut-once list.
- This is so that we can treat the CAF as a root when collecting
+ - it puts the CAF on the oldest generation's mutable list.
+ This is so that we treat the CAF as a root when collecting
younger generations.
For GHCI, we have additional requirements when dealing with CAFs:
@@ -259,10 +266,8 @@ freeStorage (void)
-------------------------------------------------------------------------- */
void
-newCAF(StgClosure* caf)
+newCAF(StgRegTable *reg, StgClosure* caf)
{
- ACQUIRE_SM_LOCK;
-
#ifdef DYNAMIC
if(keepCAFs)
{
@@ -277,24 +282,19 @@ newCAF(StgClosure* caf)
// do another hack here and do an address range test on caf to figure
// out whether it is from a dynamic library.
((StgIndStatic *)caf)->saved_info = (StgInfoTable *)caf->header.info;
+
+ ACQUIRE_SM_LOCK; // caf_list is global, locked by sm_mutex
((StgIndStatic *)caf)->static_link = caf_list;
caf_list = caf;
+ RELEASE_SM_LOCK;
}
else
#endif
{
- /* Put this CAF on the mutable list for the old generation.
- * This is a HACK - the IND_STATIC closure doesn't really have
- * a mut_link field, but we pretend it has - in fact we re-use
- * the STATIC_LINK field for the time being, because when we
- * come to do a major GC we won't need the mut_link field
- * any more and can use it as a STATIC_LINK.
- */
+ // Put this CAF on the mutable list for the old generation.
((StgIndStatic *)caf)->saved_info = NULL;
- recordMutableGen(caf, oldest_gen->no);
+ recordMutableCap(caf, regTableToCapability(reg), oldest_gen->no);
}
-
- RELEASE_SM_LOCK;
}
// An alternate version of newCaf which is used for dynamically loaded
@@ -307,7 +307,7 @@ newCAF(StgClosure* caf)
// The linker hackily arranges that references to newCaf from dynamic
// code end up pointing to newDynCAF.
void
-newDynCAF(StgClosure *caf)
+newDynCAF (StgRegTable *reg STG_UNUSED, StgClosure *caf)
{
ACQUIRE_SM_LOCK;