projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix a bug which sometimes caused extra major GCs to be performed
[ghc-hetmet.git]
/
rts
/
sm
/
Compact.c
diff --git
a/rts/sm/Compact.c
b/rts/sm/Compact.c
index
9f0a69d
..
5f56c1e
100644
(file)
--- a/
rts/sm/Compact.c
+++ b/
rts/sm/Compact.c
@@
-490,6
+490,10
@@
update_fwd_large( bdescr *bd )
for (; bd != NULL; bd = bd->link) {
for (; bd != NULL; bd = bd->link) {
+ // nothing to do in a pinned block; it might not even have an object
+ // at the beginning.
+ if (bd->flags & BF_PINNED) continue;
+
p = bd->start;
info = get_itbl((StgClosure *)p);
p = bd->start;
info = get_itbl((StgClosure *)p);
@@
-621,8
+625,6
@@
thread_obj (StgInfoTable *info, StgPtr p)
case MUT_VAR_CLEAN:
case MUT_VAR_DIRTY:
case CAF_BLACKHOLE:
case MUT_VAR_CLEAN:
case MUT_VAR_DIRTY:
case CAF_BLACKHOLE:
- case SE_CAF_BLACKHOLE:
- case SE_BLACKHOLE:
case BLACKHOLE:
{
StgPtr end;
case BLACKHOLE:
{
StgPtr end;
@@
-966,9
+968,6
@@
compact(StgClosure *static_objects)
// 1. thread the roots
markCapabilities((evac_fn)thread_root, NULL);
// 1. thread the roots
markCapabilities((evac_fn)thread_root, NULL);
- // spark queues
- traverseSparkQueues((evac_fn)thread_root, NULL);
-
// the weak pointer lists...
if (weak_ptr_list != NULL) {
thread((void *)&weak_ptr_list);
// the weak pointer lists...
if (weak_ptr_list != NULL) {
thread((void *)&weak_ptr_list);
@@
-981,11
+980,20
@@
compact(StgClosure *static_objects)
for (g = 1; g < RtsFlags.GcFlags.generations; g++) {
bdescr *bd;
StgPtr p;
for (g = 1; g < RtsFlags.GcFlags.generations; g++) {
bdescr *bd;
StgPtr p;
+ nat n;
for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
for (p = bd->start; p < bd->free; p++) {
thread((StgClosure **)p);
}
}
for (bd = generations[g].mut_list; bd != NULL; bd = bd->link) {
for (p = bd->start; p < bd->free; p++) {
thread((StgClosure **)p);
}
}
+ for (n = 0; n < n_capabilities; n++) {
+ for (bd = capabilities[n].mut_lists[g];
+ bd != NULL; bd = bd->link) {
+ for (p = bd->start; p < bd->free; p++) {
+ thread((StgClosure **)p);
+ }
+ }
+ }
}
// the global thread list
}
// the global thread list
@@
-996,6
+1004,9
@@
compact(StgClosure *static_objects)
// any threads resurrected during this GC
thread((void *)&resurrected_threads);
// any threads resurrected during this GC
thread((void *)&resurrected_threads);
+ // the blackhole queue
+ thread((void *)&blackhole_queue);
+
// the task list
{
Task *task;
// the task list
{
Task *task;