зеркало из https://github.com/github/ruby.git
Check need_major_gc during GC stress
need_major_gc is set when a major GC is required. However, if gc_stress_no_major is also set, then it will not actually run a major GC. For example, the following script will sometimes crash: ``` GC.stress = 1 50000.times.map { [] } ``` With the following message: ``` [BUG] cannot create a new page after major GC ```
This commit is contained in:
Родитель
b8df6b9e01
Коммит
0dc40bd2b7
19
gc.c
19
gc.c
|
@ -9460,18 +9460,17 @@ gc_start(rb_objspace_t *objspace, unsigned int reason)
|
|||
|
||||
objspace->flags.immediate_sweep = !(flag & (1<<gc_stress_no_immediate_sweep));
|
||||
}
|
||||
else {
|
||||
if (objspace->rgengc.need_major_gc) {
|
||||
reason |= objspace->rgengc.need_major_gc;
|
||||
do_full_mark = TRUE;
|
||||
}
|
||||
else if (RGENGC_FORCE_MAJOR_GC) {
|
||||
reason = GPR_FLAG_MAJOR_BY_FORCE;
|
||||
do_full_mark = TRUE;
|
||||
}
|
||||
|
||||
objspace->rgengc.need_major_gc = GPR_FLAG_NONE;
|
||||
if (objspace->rgengc.need_major_gc) {
|
||||
reason |= objspace->rgengc.need_major_gc;
|
||||
do_full_mark = TRUE;
|
||||
}
|
||||
else if (RGENGC_FORCE_MAJOR_GC) {
|
||||
reason = GPR_FLAG_MAJOR_BY_FORCE;
|
||||
do_full_mark = TRUE;
|
||||
}
|
||||
|
||||
objspace->rgengc.need_major_gc = GPR_FLAG_NONE;
|
||||
|
||||
if (do_full_mark && (reason & GPR_FLAG_MAJOR_MASK) == 0) {
|
||||
reason |= GPR_FLAG_MAJOR_BY_FORCE; /* GC by CAPI, METHOD, and so on. */
|
||||
|
|
Загрузка…
Ссылка в новой задаче