projects
/
ghc-hetmet.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
5af1615
)
recordMutableGen_GC: we must call the spinlocked version of allocBlock()
author
Simon Marlow
<simonmar@microsoft.com>
Fri, 11 Jan 2008 13:54:53 +0000
(13:54 +0000)
committer
Simon Marlow
<simonmar@microsoft.com>
Fri, 11 Jan 2008 13:54:53 +0000
(13:54 +0000)
includes/Storage.h
patch
|
blob
|
history
diff --git
a/includes/Storage.h
b/includes/Storage.h
index
62d57b1
..
3b3bc1f
100644
(file)
--- a/
includes/Storage.h
+++ b/
includes/Storage.h
@@
-259,11
+259,28
@@
recordMutableGenLock(StgClosure *p, generation *gen)
RELEASE_SM_LOCK;
}
RELEASE_SM_LOCK;
}
+extern bdescr *allocBlock_sync(void);
+
+// Version of recordMutableGen() for use in parallel GC. The same as
+// recordMutableGen(), except that we surround it with a spinlock and
+// call the spinlock version of allocBlock().
INLINE_HEADER void
recordMutableGen_GC(StgClosure *p, generation *gen)
{
INLINE_HEADER void
recordMutableGen_GC(StgClosure *p, generation *gen)
{
+ bdescr *bd;
+
ACQUIRE_SPIN_LOCK(&recordMutableGen_sync);
ACQUIRE_SPIN_LOCK(&recordMutableGen_sync);
- recordMutableGen(p,gen);
+
+ bd = gen->mut_list;
+ if (bd->free >= bd->start + BLOCK_SIZE_W) {
+ bdescr *new_bd;
+ new_bd = allocBlock_sync();
+ new_bd->link = bd;
+ bd = new_bd;
+ gen->mut_list = bd;
+ }
+ *bd->free++ = (StgWord)p;
+
RELEASE_SPIN_LOCK(&recordMutableGen_sync);
}
RELEASE_SPIN_LOCK(&recordMutableGen_sync);
}