[coop] Ensure we exit blocking mode when invoking managed code
authorLudovic Henry <ludovic@xamarin.com>
Mon, 1 Feb 2016 13:11:44 +0000 (13:11 +0000)
committerLudovic Henry <ludovic@xamarin.com>
Mon, 1 Feb 2016 20:53:02 +0000 (20:53 +0000)
mono_runtime_invoke might be called by P/Invoked code, which is in blocking mode. Not switching back to running can lead to a crash when hitting a safepoint.

mono/metadata/object.c

index 94c29712f16ed44bd889763d1378e2fa24e65c4a..fb0d0c1879815718557c50c76c0354bed1139d6e 100644 (file)
@@ -2904,8 +2904,12 @@ mono_runtime_invoke (MonoMethod *method, void *obj, void **params, MonoObject **
        if (mono_profiler_get_events () & MONO_PROFILE_METHOD_EVENTS)
                mono_profiler_method_start_invoke (method);
 
+       MONO_PREPARE_RESET_BLOCKING;
+
        result = do_runtime_invoke (method, obj, params, exc);
 
+       MONO_FINISH_RESET_BLOCKING;
+
        if (mono_profiler_get_events () & MONO_PROFILE_METHOD_EVENTS)
                mono_profiler_method_end_invoke (method);