Skip to content

Commit bb96a3e

Browse files
jechterUnityAlex
authored andcommitted
Don't use mono_gc_is_moving for incremental gc (#1228)
1 parent 388db5d commit bb96a3e

File tree

7 files changed

+31
-9
lines changed

7 files changed

+31
-9
lines changed

mono/metadata/boehm-gc.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -237,17 +237,16 @@ mono_gc_base_init (void)
237237
opt = strchr (opt, '=') + 1;
238238
if (*opt && mono_gc_parse_environment_string_extract_number (opt, &time_limit)) {
239239
GC_enable_incremental ();
240-
#if HAVE_BDWGC_GC
241-
if (time_limit != 0)
240+
if (time_limit != 0) {
242241
// value is in milliseconds
243242
GC_set_time_limit (time_limit);
244-
#endif
243+
}
245244
}
246245
continue;
247246
} else if (g_str_has_prefix (opt, "strict-wbarriers")) {
248247
gc_strict_wbarriers = TRUE;
249248
continue;
250-
}else {
249+
} else {
251250
/* Could be a parameter for sgen */
252251
/*
253252
fprintf (stderr, "MONO_GC_PARAMS must be a comma-delimited list of one or more of the following:\n");
@@ -1186,6 +1185,12 @@ mono_gc_set_desktop_mode (void)
11861185

11871186
gboolean
11881187
mono_gc_is_moving (void)
1188+
{
1189+
return FALSE;
1190+
}
1191+
1192+
gboolean
1193+
mono_gc_needs_write_barriers(void)
11891194
{
11901195
return GC_is_incremental_mode ();
11911196
}

mono/metadata/gc-internals.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
} while (0)
6363

6464
/* useful until we keep track of gc-references in corlib etc. */
65-
#define IS_GC_REFERENCE(class,t) (mono_gc_is_moving () ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib))
65+
#define IS_GC_REFERENCE(class,t) (mono_gc_needs_write_barriers() ? FALSE : ((t)->type == MONO_TYPE_U && (class)->image == mono_defaults.corlib))
6666

6767
void mono_object_register_finalizer (MonoObject *obj);
6868

@@ -320,6 +320,11 @@ void mono_gc_set_desktop_mode (void);
320320
*/
321321
gboolean mono_gc_is_moving (void);
322322

323+
/*
324+
* Return whenever this GC needs write barriers
325+
*/
326+
gboolean mono_gc_needs_write_barriers (void);
327+
323328
typedef void* (*MonoGCLockedCallbackFunc) (void *data);
324329

325330
void* mono_gc_invoke_with_gc_lock (MonoGCLockedCallbackFunc func, void *data);

mono/metadata/null-gc.c

+6
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,12 @@ mono_gc_is_moving (void)
466466
return FALSE;
467467
}
468468

469+
gboolean
470+
mono_gc_needs_write_barriers(void)
471+
{
472+
return FALSE;
473+
}
474+
469475
gboolean
470476
mono_gc_is_disabled (void)
471477
{

mono/metadata/object.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -6353,7 +6353,7 @@ mono_array_full_copy (MonoArray *src, MonoArray *dest)
63536353
static void
63546354
array_full_copy_unchecked_size (MonoArray *src, MonoArray *dest, MonoClass *klass, uintptr_t size)
63556355
{
6356-
if (mono_gc_is_moving ()) {
6356+
if (mono_gc_needs_write_barriers ()) {
63576357
MonoClass *element_class = m_class_get_element_class (klass);
63586358
if (m_class_is_valuetype (element_class)) {
63596359
if (m_class_has_references (element_class))
@@ -7219,7 +7219,7 @@ mono_value_box_handle (MonoDomain *domain, MonoClass *klass, gpointer value, Mon
72197219
return_val_if_nok (error, NULL_HANDLE);
72207220

72217221
size -= MONO_ABI_SIZEOF (MonoObject);
7222-
if (mono_gc_is_moving ()) {
7222+
if (mono_gc_needs_write_barriers ()) {
72237223
g_assert (size == mono_class_value_size (klass, NULL));
72247224
MONO_ENTER_NO_SAFEPOINTS;
72257225
gpointer data = mono_handle_get_data_unsafe (res_handle);

mono/metadata/sgen-mono.c

+6
Original file line numberDiff line numberDiff line change
@@ -2581,6 +2581,12 @@ mono_gc_is_moving (void)
25812581
return TRUE;
25822582
}
25832583

2584+
gboolean
2585+
mono_gc_needs_write_barriers(void)
2586+
{
2587+
return TRUE;
2588+
}
2589+
25842590
gboolean
25852591
mono_gc_is_disabled (void)
25862592
{

mono/mini/aot-compiler.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -4455,7 +4455,7 @@ add_gc_wrappers (MonoAotCompile *acfg)
44554455
}
44564456

44574457
/* write barriers */
4458-
if (mono_gc_is_moving ()) {
4458+
if (mono_gc_needs_write_barriers ()) {
44594459
add_method (acfg, mono_gc_get_specific_write_barrier (FALSE));
44604460
add_method (acfg, mono_gc_get_specific_write_barrier (TRUE));
44614461
}

mono/mini/mini-gc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2647,7 +2647,7 @@ mini_gc_set_slot_type_from_cfa (MonoCompile *cfg, int slot_offset, GCSlotType ty
26472647
void
26482648
mini_gc_init_cfg (MonoCompile *cfg)
26492649
{
2650-
if (mono_gc_is_moving ()) {
2650+
if (mono_gc_needs_write_barriers()) {
26512651
cfg->disable_ref_noref_stack_slot_share = TRUE;
26522652
cfg->gen_write_barriers = TRUE;
26532653
}

0 commit comments

Comments
 (0)