Skip to content

Commit 16b93e4

Browse files
committed
Fix option detection.
Fixed a bug where the post-alloc fast path is not enabled if the plan is not set from command line. Now we read the actual value set in the MMTk builder structure for the actually selected plan. Also added a global variable so that mutators can test if write barrier is needed before calling into the write barrier in mmtk-core.
1 parent 1612916 commit 16b93e4

File tree

4 files changed

+52
-5
lines changed

4 files changed

+52
-5
lines changed

gc.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -9195,7 +9195,7 @@ void
91959195
rb_gc_writebarrier(VALUE a, VALUE b)
91969196
{
91979197
#if USE_MMTK
9198-
if (rb_mmtk_enabled_p()) {
9198+
if (rb_mmtk_enabled_p() && rb_mmtk_use_barrier) {
91999199
mmtk_object_reference_write_post(GET_THREAD()->mutator, (MMTk_ObjectReference)a);
92009200
return;
92019201
}
@@ -9287,7 +9287,7 @@ void
92879287
rb_gc_writebarrier_remember(VALUE obj)
92889288
{
92899289
#if USE_MMTK
9290-
if (rb_mmtk_enabled_p()) {
9290+
if (rb_mmtk_enabled_p() && rb_mmtk_use_barrier) {
92919291
mmtk_object_reference_write_post(GET_THREAD()->mutator, (MMTk_ObjectReference)obj);
92929292
return;
92939293
}

internal/mmtk.h

+15
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,21 @@ void mmtk_builder_set_fixed_heap_size(MMTk_Builder *builder, size_t heap_size);
114114
*/
115115
void mmtk_builder_set_plan(MMTk_Builder *builder, const char *plan_name);
116116

117+
/**
118+
* Query if the selected plan is MarkSweep.
119+
*/
120+
bool mmtk_builder_is_mark_sweep(MMTk_Builder *builder);
121+
122+
/**
123+
* Query if the selected plan is Immix.
124+
*/
125+
bool mmtk_builder_is_immix(MMTk_Builder *builder);
126+
127+
/**
128+
* Query if the selected plan is StickyImmix.
129+
*/
130+
bool mmtk_builder_is_sticky_immix(MMTk_Builder *builder);
131+
117132
/**
118133
* Build an MMTk instance.
119134
*

internal/mmtk_support.h

+3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ typedef struct {
3232
VALUE ary[]; // The actual content.
3333
} rb_mmtk_objbuf_t;
3434

35+
// Write barrier
36+
extern bool rb_mmtk_use_barrier;
37+
3538
// Enabled?
3639
bool rb_mmtk_enabled_p(void);
3740

mmtk_support.c

+32-3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ const char *mmtk_chosen_plan = NULL;
6262
bool mmtk_plan_is_immix = false;
6363
bool mmtk_plan_uses_bump_pointer = false;
6464
bool mmtk_plan_implicitly_pinning = false;
65+
bool rb_mmtk_use_barrier = false;
6566

6667
size_t mmtk_pre_max_heap_size = 0;
6768
size_t mmtk_post_max_heap_size = 0;
@@ -269,16 +270,41 @@ apply_cmdline_options(MMTk_Builder *mmtk_builder)
269270
{
270271
if (mmtk_chosen_plan != NULL) {
271272
mmtk_builder_set_plan(mmtk_builder, mmtk_chosen_plan);
272-
mmtk_plan_is_immix = strcmp(mmtk_chosen_plan, "Immix") == 0 || strcmp(mmtk_chosen_plan, "StickyImmix") == 0;
273-
mmtk_plan_uses_bump_pointer = mmtk_plan_is_immix;
274-
mmtk_plan_implicitly_pinning = strcmp(mmtk_chosen_plan, "MarkSweep") == 0;
275273
}
276274

277275
if (mmtk_max_heap_size > 0) {
278276
mmtk_builder_set_fixed_heap_size(mmtk_builder, mmtk_max_heap_size);
279277
}
280278
}
281279

280+
static void
281+
set_variables_from_options(MMTk_Builder *mmtk_builder)
282+
{
283+
mmtk_plan_is_immix = mmtk_builder_is_immix(mmtk_builder) || mmtk_builder_is_sticky_immix(mmtk_builder);
284+
RUBY_DEBUG_LOG("mmtk_plan_is_immix = %d\n", mmtk_plan_is_immix);
285+
286+
mmtk_plan_uses_bump_pointer = mmtk_plan_is_immix;
287+
RUBY_DEBUG_LOG("mmtk_plan_uses_bump_pointer = %d\n", mmtk_plan_uses_bump_pointer);
288+
289+
mmtk_plan_implicitly_pinning = mmtk_builder_is_mark_sweep(mmtk_builder);
290+
RUBY_DEBUG_LOG("mmtk_plan_implicitly_pinning = %d\n", mmtk_plan_implicitly_pinning);
291+
292+
// We sometimes for disabling or enabling barriers to measure the impact of barriers.
293+
const char* barrier_env_var = getenv("RB_MMTK_FORCE_BARRIER");
294+
if (barrier_env_var != NULL) {
295+
if (strcmp(barrier_env_var, "1") == 0) {
296+
rb_mmtk_use_barrier = true;
297+
fprintf(stderr, "WARNING: Force enabling barrier!\n");
298+
} else {
299+
rb_mmtk_use_barrier = false;
300+
fprintf(stderr, "WARNING: Force disabling barrier!\n");
301+
}
302+
} else {
303+
rb_mmtk_use_barrier = mmtk_builder_is_sticky_immix(mmtk_builder);
304+
}
305+
RUBY_DEBUG_LOG("rb_mmtk_use_barrier = %d\n", rb_mmtk_use_barrier);
306+
}
307+
282308
void
283309
rb_mmtk_main_thread_init(void)
284310
{
@@ -294,6 +320,9 @@ rb_mmtk_main_thread_init(void)
294320
// (4) Apply cmdline or RUBYOPT options if set.
295321
apply_cmdline_options(mmtk_builder);
296322

323+
// Set Ruby-level variables from the actually set options.
324+
set_variables_from_options(mmtk_builder);
325+
297326
#if RACTOR_CHECK_MODE
298327
ruby_binding_options.ractor_check_mode = true;
299328
// Ruby only needs a uint32_t for the ractor ID.

0 commit comments

Comments
 (0)