diff options
author | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-06 14:46:39 +0000 |
---|---|---|
committer | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-06 14:46:39 +0000 |
commit | dd4b718457a2ca92adec8644faf6482cd66e6d57 (patch) | |
tree | fcef6375978722c6c718f39f6f08a58b21b477dc /gc.c | |
parent | ce4a6e685d9b5847007321ed8984f0b8c27d3ebd (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.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -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 { |