зеркало из https://github.com/github/ruby.git
* gc.c (gc_writebarrier_generational): add an alternative write
barrier (WB) implementation. When finding reference from [Old obj] to [New obj] by WB, current implementation marks [Old obj] as remembered old objects and marks chilldren of [Old obj] at the beggining of marking. Added (but disabled) code changes current behaviour. This fix promote [New obj] to old and marks as a remembered old object. We can assume "new objects referred from old objects are maybe long-lived old objects". Disadvantage of added algorithm is we may promote unwilling short-lived objects. For example, consider many new objects push and pop to an old stack object. All of new objects (short-lived objects) promote to old objects unexpectedly. To compare these behaviour, I add this new code (but disabled it). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50006 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
3b1e28036e
Коммит
ec4624b0f4
20
ChangeLog
20
ChangeLog
|
@ -1,3 +1,23 @@
|
||||||
|
Wed Mar 18 17:21:12 2015 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* gc.c (gc_writebarrier_generational): add an alternative write
|
||||||
|
barrier (WB) implementation.
|
||||||
|
When finding reference from [Old obj] to [New obj] by WB, current
|
||||||
|
implementation marks [Old obj] as remembered old objects and marks
|
||||||
|
chilldren of [Old obj] at the beggining of marking.
|
||||||
|
|
||||||
|
Added (but disabled) code changes current behaviour. This fix promote
|
||||||
|
[New obj] to old and marks as a remembered old object. We can assume
|
||||||
|
"new objects referred from old objects are maybe long-lived old
|
||||||
|
objects".
|
||||||
|
|
||||||
|
Disadvantage of added algorithm is we may promote unwilling
|
||||||
|
short-lived objects. For example, consider many new objects push and
|
||||||
|
pop to an old stack object. All of new objects (short-lived objects)
|
||||||
|
promote to old objects unexpectedly.
|
||||||
|
|
||||||
|
To compare these behaviour, I add this new code (but disabled it).
|
||||||
|
|
||||||
Wed Mar 18 17:14:39 2015 Koichi Sasada <ko1@atdot.net>
|
Wed Mar 18 17:14:39 2015 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
* gc.c (RVALUE_PROMOTE_RAW): rename to RVALUE_OLD_LONG_LIVED_SET()
|
* gc.c (RVALUE_PROMOTE_RAW): rename to RVALUE_OLD_LONG_LIVED_SET()
|
||||||
|
|
24
gc.c
24
gc.c
|
@ -5464,15 +5464,33 @@ static void
|
||||||
gc_writebarrier_generational(rb_objspace_t *objspace, VALUE a, VALUE b)
|
gc_writebarrier_generational(rb_objspace_t *objspace, VALUE a, VALUE b)
|
||||||
{
|
{
|
||||||
if (RGENGC_CHECK_MODE) {
|
if (RGENGC_CHECK_MODE) {
|
||||||
if (!RVALUE_OLD_P(a)) rb_bug("rb_gc_writebarrier_generational: %s is not an old object.", obj_info(a));
|
if (!RVALUE_OLD_P(a)) rb_bug("gc_writebarrier_generational: %s is not an old object.", obj_info(a));
|
||||||
if ( RVALUE_OLD_P(b)) rb_bug("rb_gc_writebarrier_generational: %s is an old object.", obj_info(b));
|
if ( RVALUE_OLD_P(b)) rb_bug("gc_writebarrier_generational: %s is an old object.", obj_info(b));
|
||||||
if (is_incremental_marking(objspace)) rb_bug("rb_gc_writebarrier_generational: called while incremental marking: %s -> %s", obj_info(a), obj_info(b));
|
if (is_incremental_marking(objspace)) rb_bug("rb_gc_writebarrier_generational: called while incremental marking: %s -> %s", obj_info(a), obj_info(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
/* mark `a' and remember (default behaviour) */
|
||||||
if (!rgengc_remembered(objspace, a)) {
|
if (!rgengc_remembered(objspace, a)) {
|
||||||
gc_report(1, objspace, "rb_gc_writebarrier_generational: %s -> %s\n", obj_info(a), obj_info(b));
|
|
||||||
rgengc_remember(objspace, a);
|
rgengc_remember(objspace, a);
|
||||||
|
gc_report(1, objspace, "rb_gc_writebarrier_generational: %s (remembered) -> %s\n", obj_info(a), obj_info(b));
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
/* mark `b' and remember */
|
||||||
|
MARK_IN_BITMAP(GET_HEAP_MARK_BITS(b), b);
|
||||||
|
if (RVALUE_WB_UNPROTECTED(b)) {
|
||||||
|
gc_remember_unprotected(objspace, b);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
RVALUE_AGE_SET_OLD(objspace, b);
|
||||||
|
rgengc_remember(objspace, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
gc_report(1, objspace, "gc_writebarrier_generational: %s -> %s (remembered)\n", obj_info(a), obj_info(b));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
check_rvalue_consistency(a);
|
||||||
|
check_rvalue_consistency(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if GC_ENABLE_INCREMENTAL_MARK
|
#if GC_ENABLE_INCREMENTAL_MARK
|
||||||
|
|
Загрузка…
Ссылка в новой задаче