#include <mono/metadata/marshal.h>
#include <mono/metadata/profiler-private.h>
#include <mono/utils/mono-time.h>
+#include <mono/utils/atomic.h>
/*
* Pull the list of opcodes
new->wait_list = g_slist_remove (new->wait_list, new->wait_list->data);
}
}
- mono_gc_weak_link_remove (&new->data);
+ mono_gc_weak_link_remove (&new->data, FALSE);
new->data = monitor_freelist;
monitor_freelist = new;
}
new->owner = id;
new->nest = 1;
+ new->data = NULL;
#ifndef DISABLE_PERFCOUNTERS
mono_perfcounters->gc_sync_blocks++;
return NULL;
}
+#ifndef DISABLE_JIT
+
static void
emit_obj_syncp_check (MonoMethodBuilder *mb, int syncp_loc, int *obj_null_branch, int *true_locktaken_branch, int *syncp_true_false_branch,
int *thin_hash_branch, gboolean branch_on_true)
*syncp_true_false_branch = mono_mb_emit_short_branch (mb, branch_on_true ? CEE_BRTRUE_S : CEE_BRFALSE_S);
}
+#endif
+
static MonoMethod* monitor_il_fastpaths[3];
gboolean
mb->method->flags = METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC |
METHOD_ATTRIBUTE_HIDE_BY_SIG | METHOD_ATTRIBUTE_FINAL;
+#ifndef DISABLE_JIT
tid_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
syncp_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
owner_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
mono_mb_emit_byte (mb, CEE_LDARG_1);
mono_mb_emit_managed_call (mb, monitor_enter_method, NULL);
mono_mb_emit_byte (mb, CEE_RET);
+#endif
res = register_fastpath (mono_mb_create_method (mb, mono_signature_no_pinvoke (monitor_enter_method), 5), fast_path_idx);
mb->method->flags = METHOD_ATTRIBUTE_PUBLIC | METHOD_ATTRIBUTE_STATIC |
METHOD_ATTRIBUTE_HIDE_BY_SIG | METHOD_ATTRIBUTE_FINAL;
+#ifndef DISABLE_JIT
syncp_loc = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
emit_obj_syncp_check (mb, syncp_loc, &obj_null_branch, NULL, &has_syncp_branch, &thin_hash_branch, TRUE);
mono_mb_emit_byte (mb, CEE_LDARG_0);
mono_mb_emit_managed_call (mb, monitor_exit_method, NULL);
mono_mb_emit_byte (mb, CEE_RET);
+#endif
res = register_fastpath (mono_mb_create_method (mb, mono_signature_no_pinvoke (monitor_exit_method), 5), FASTPATH_EXIT);
mono_mb_free (mb);