Skip to content

Commit

Permalink
Check need_major_gc during GC stress
Browse files Browse the repository at this point in the history
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
```
  • Loading branch information
peterzhu2118 committed Dec 7, 2023
1 parent b8df6b9 commit 0dc40bd
Showing 1 changed file with 9 additions and 10 deletions.
19 changes: 9 additions & 10 deletions gc.c
Expand Up @@ -9460,19 +9460,18 @@ 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. */
}
Expand Down

0 comments on commit 0dc40bd

Please sign in to comment.