return TRUE;
}
+gboolean
+thread_in_critical_region (SgenThreadInfo *info)
+{
+ return info->in_critical_region;
+}
+
void
mono_gc_base_init (void)
{
cb.thread_unregister = sgen_thread_unregister;
cb.thread_attach = sgen_thread_attach;
cb.mono_method_is_critical = (gpointer)is_critical_method;
+ cb.mono_thread_in_critical_region = thread_in_critical_region;
#ifndef HOST_WIN32
cb.thread_exit = mono_gc_pthread_exit;
cb.mono_gc_pthread_create = (gpointer)mono_gc_pthread_create;
MonoMethod *method;
MonoJitInfo *ji;
+ /* Are we inside a system critical region? */
if (info->inside_critical_region)
return TRUE;
+ /* Are we inside a GC critical region? */
+ if (threads_callbacks.mono_thread_in_critical_region && threads_callbacks.mono_thread_in_critical_region (info)) {
+ return TRUE;
+ }
+
/* The target thread might be shutting down and the domain might be null, which means no managed code left to run. */
if (!info->suspend_state.unwind_data [MONO_UNWIND_DATA_DOMAIN])
return FALSE;
void (*thread_detach)(THREAD_INFO_TYPE *info);
void (*thread_attach)(THREAD_INFO_TYPE *info);
gboolean (*mono_method_is_critical) (void *method);
+ gboolean (*mono_thread_in_critical_region) (THREAD_INFO_TYPE *info);
void (*thread_exit)(void *retval);
#ifndef HOST_WIN32
int (*mono_gc_pthread_create) (pthread_t *new_thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);