mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* gc.c: change oldmalloc meaning.
Increase oldmalloc_increase with malloc_increase instead of using obj_memsize_of(). This change will avoid the danger of memory full without major GC. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44040 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f09058b877
commit
b91e889c34
2 changed files with 20 additions and 16 deletions
|
@ -1,3 +1,11 @@
|
|||
Fri Dec 6 19:18:02 2013 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* gc.c: change oldmalloc meaning.
|
||||
Increase oldmalloc_increase with malloc_increase
|
||||
instead of using obj_memsize_of().
|
||||
|
||||
This change will avoid the danger of memory full without major GC.
|
||||
|
||||
Fri Dec 6 19:08:48 2013 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* gc.c (atomic_sub_nounderflow): not 0 but val itself.
|
||||
|
|
28
gc.c
28
gc.c
|
@ -2889,17 +2889,11 @@ gc_before_sweep(rb_objspace_t *objspace)
|
|||
objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_OLDMALLOC;;
|
||||
objspace->rgengc.oldmalloc_increase_limit =
|
||||
(size_t)(objspace->rgengc.oldmalloc_increase_limit * gc_params.oldmalloc_limit_growth_factor);
|
||||
|
||||
if (objspace->rgengc.oldmalloc_increase_limit > gc_params.oldmalloc_limit_max) {
|
||||
objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_max;
|
||||
}
|
||||
}
|
||||
else {
|
||||
objspace->rgengc.oldmalloc_increase_limit =
|
||||
(size_t)(objspace->rgengc.oldmalloc_increase_limit / ((gc_params.oldmalloc_limit_growth_factor - 1)/10 + 1));
|
||||
if (objspace->rgengc.oldmalloc_increase_limit < gc_params.oldmalloc_limit_min) {
|
||||
objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min;
|
||||
}
|
||||
}
|
||||
|
||||
if (0) fprintf(stderr, "%d\t%d\t%u\t%u\t%d\n", (int)rb_gc_count(), objspace->rgengc.need_major_gc,
|
||||
(unsigned int)objspace->rgengc.oldmalloc_increase,
|
||||
|
@ -2909,6 +2903,14 @@ gc_before_sweep(rb_objspace_t *objspace)
|
|||
else {
|
||||
/* major GC */
|
||||
objspace->rgengc.oldmalloc_increase = 0;
|
||||
|
||||
if ((objspace->profile.latest_gc_info & GPR_FLAG_MAJOR_BY_OLDMALLOC) == 0) {
|
||||
objspace->rgengc.oldmalloc_increase_limit =
|
||||
(size_t)(objspace->rgengc.oldmalloc_increase_limit / ((gc_params.oldmalloc_limit_growth_factor - 1)/10 + 1));
|
||||
if (objspace->rgengc.oldmalloc_increase_limit < gc_params.oldmalloc_limit_min) {
|
||||
objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -3619,11 +3621,6 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
|
|||
/* infant -> old */
|
||||
objspace->rgengc.old_object_count++;
|
||||
objspace->rgengc.parent_object_is_old = TRUE;
|
||||
|
||||
#if RGENGC_ESTIMATE_OLDMALLOC
|
||||
objspace->rgengc.oldmalloc_increase += obj_memsize_of((VALUE)obj, FALSE);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
rgengc_report(3, objspace, "gc_mark_children: promote infant -> young %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
|
||||
}
|
||||
|
@ -3635,9 +3632,6 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
|
|||
/* young -> old */
|
||||
RVALUE_PROMOTE_YOUNG((VALUE)obj);
|
||||
objspace->rgengc.old_object_count++;
|
||||
#if RGENGC_ESTIMATE_OLDMALLOC
|
||||
objspace->rgengc.oldmalloc_increase += obj_memsize_of((VALUE)obj, FALSE);
|
||||
#endif
|
||||
rgengc_report(3, objspace, "gc_mark_children: promote young -> old %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
|
||||
}
|
||||
else {
|
||||
|
@ -4867,7 +4861,7 @@ garbage_collect_body(rb_objspace_t *objspace, int full_mark, int immediate_sweep
|
|||
if (immediate_sweep) reason |= GPR_FLAG_IMMEDIATE_SWEEP;
|
||||
full_mark = (reason & GPR_FLAG_MAJOR_MASK) ? TRUE : FALSE;
|
||||
|
||||
if (GC_NOTIFY) fprintf(stderr, "start garbage_collect(%d, %d, %d)\n", full_mark, immediate_sweep, reason);
|
||||
if (GC_NOTIFY) fprintf(stderr, "start garbage_collect(%d, %d, %d)\n", full_mark, immediate_sweep, reason);
|
||||
|
||||
objspace->profile.count++;
|
||||
objspace->profile.latest_gc_info = reason;
|
||||
|
@ -5826,9 +5820,11 @@ objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, si
|
|||
{
|
||||
if (new_size > old_size) {
|
||||
ATOMIC_SIZE_ADD(malloc_increase, new_size - old_size);
|
||||
ATOMIC_SIZE_ADD(objspace->rgengc.oldmalloc_increase, new_size - old_size);
|
||||
}
|
||||
else {
|
||||
atomic_sub_nounderflow(&malloc_increase, old_size - new_size);
|
||||
atomic_sub_nounderflow(&objspace->rgengc.oldmalloc_increase, old_size - new_size);
|
||||
}
|
||||
|
||||
if (type == MEMOP_TYPE_MALLOC) {
|
||||
|
|
Loading…
Add table
Reference in a new issue