summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authortarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-06 14:46:39 +0000
committertarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-06 14:46:39 +0000
commitdd4b718457a2ca92adec8644faf6482cd66e6d57 (patch)
treefcef6375978722c6c718f39f6f08a58b21b477dc /gc.c
parentce4a6e685d9b5847007321ed8984f0b8c27d3ebd (diff)
* gc.c (heaps_slot, assign_heap_slot, gc_sweep): skip sweep if
heap_slot's status is pre-free phase. [ruby-dev:41543] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28191 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/gc.c b/gc.c
index e7239690ce..f7d2d3dc9b 100644
--- a/gc.c
+++ b/gc.c
@@ -280,6 +280,7 @@ struct heaps_slot {
void *membase;
RVALUE *slot;
size_t limit;
+ int finalize_flag;
};
#define HEAP_MIN_SLOTS 10000
@@ -938,6 +939,7 @@ assign_heap_slot(rb_objspace_t *objspace)
heaps[hi].membase = membase;
heaps[hi].slot = p;
heaps[hi].limit = objs;
+ heaps[hi].finalize_flag = FALSE;
pend = p + objs;
if (lomem == 0 || lomem > p) lomem = p;
if (himem < pend) himem = pend;
@@ -1874,6 +1876,8 @@ gc_sweep(rb_objspace_t *objspace)
RVALUE *final = final_list;
int deferred;
+ if(heaps[i].finalize_flag) continue;
+
p = heaps[i].slot; pend = p + heaps[i].limit;
while (p < pend) {
if (!(p->as.basic.flags & FL_MARK)) {
@@ -1912,7 +1916,7 @@ gc_sweep(rb_objspace_t *objspace)
pp->as.free.flags |= FL_SINGLETON; /* freeing page mark */
}
heaps[i].limit = final_num;
-
+ heaps[i].finalize_flag = TRUE;
freelist = free; /* cancel this page from freelist */
}
else {