summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-13 10:42:57 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-13 10:42:57 +0000
commit96af71a288ef97800b658b4d0cda7ce83f3f95be (patch)
tree1791201df7c35e3ebf6b9a73c151d78c326d30bf /gc.c
parent38c94fa149554b354b4a25c003cae046ede7a596 (diff)
* gc.c: count only freed object as freelist size.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18584 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/gc.c b/gc.c
index 0e2da328be..736dd63024 100644
--- a/gc.c
+++ b/gc.c
@@ -1636,7 +1636,7 @@ gc_sweep(rb_objspace_t *objspace)
final_list = deferred_final_list;
deferred_final_list = 0;
for (i = 0; i < heaps_used; i++) {
- int n = 0;
+ int free_num = 0, final_num = 0;
RVALUE *free = freelist;
RVALUE *final = final_list;
int deferred;
@@ -1654,11 +1654,12 @@ gc_sweep(rb_objspace_t *objspace)
p->as.free.flags |= FL_MARK;
p->as.free.next = final_list;
final_list = p;
+ final_num++;
}
else {
add_freelist(objspace, p);
+ free_num++;
}
- n++;
}
else if (BUILTIN_TYPE(p) == T_DEFERRED) {
/* objects to be finalized */
@@ -1670,21 +1671,19 @@ gc_sweep(rb_objspace_t *objspace)
}
p++;
}
- if (n == heaps[i].limit && freed > do_heap_free) {
+ if (final_num + free_num == heaps[i].limit && freed > do_heap_free) {
RVALUE *pp;
- int f_count = 0;
for (pp = final_list; pp != final; pp = pp->as.free.next) {
- f_count++;
RDATA(pp)->dmark = (void *)&heaps[i];
pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
}
- heaps[i].limit = f_count;
+ heaps[i].limit = final_num;
freelist = free; /* cancel this page from freelist */
}
else {
- freed += n;
+ freed += free_num;
}
}
GC_PROF_SET_MALLOC_INFO;