Skip to content

Commit 58d08ab

Browse files
committed
merge revision(s) a084fef: [Backport #21099]
[Bug #21099] Fix GC when Ractor list not initialized When the Ractor list is not initialized and a GC is ran at boot, then it would crash because the newobj_cache of the main Ractor is not cleared. This commit changes it to use ruby_single_main_ractor when it's available and iterate over the Ractor list when we have multiple Ractors.
1 parent c397c2d commit 58d08ab

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

gc.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,19 @@ void
249249
rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data)
250250
{
251251
rb_ractor_t *r = NULL;
252-
ccan_list_for_each(&GET_VM()->ractor.set, r, vmlr_node) {
253-
func(r->newobj_cache, data);
252+
if (RB_LIKELY(ruby_single_main_ractor)) {
253+
GC_ASSERT(
254+
ccan_list_empty(&GET_VM()->ractor.set) ||
255+
(ccan_list_top(&GET_VM()->ractor.set, rb_ractor_t, vmlr_node) == ruby_single_main_ractor &&
256+
ccan_list_tail(&GET_VM()->ractor.set, rb_ractor_t, vmlr_node) == ruby_single_main_ractor)
257+
);
258+
259+
func(ruby_single_main_ractor->newobj_cache, data);
260+
}
261+
else {
262+
ccan_list_for_each(&GET_VM()->ractor.set, r, vmlr_node) {
263+
func(r->newobj_cache, data);
264+
}
254265
}
255266
}
256267

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
1212
#define RUBY_VERSION_TEENY 4
1313
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
14-
#define RUBY_PATCHLEVEL 39
14+
#define RUBY_PATCHLEVEL 40
1515

1616
#include "ruby/version.h"
1717
#include "ruby/internal/abi.h"

0 commit comments

Comments
 (0)