[coop] Blacklist two more wrappers when generating safepoints.
authorRodrigo Kumpera <kumpera@gmail.com>
Thu, 27 Aug 2015 19:10:10 +0000 (15:10 -0400)
committerRodrigo Kumpera <kumpera@gmail.com>
Thu, 27 Aug 2015 19:21:48 +0000 (15:21 -0400)
A GC Safepoint require the thread to be in GC unsafe mode to run properly.

Both mono_threads_finish_blocking and mono_threads_reset_blocking_start are called
in GC Safe mode, which would cause them to assert in checked-build.

mono_threads_finish_blocking is called after a pinvoke finished, which means the thread will
still be in blocking mode.

mono_threads_reset_blocking_start is called by reverse pinvoke wrappers before calling managed
code, so it will be in blocking mode too.

This looks like something checked-build should catch by setting the polling variable more frequently.

mono/mini/mini.c

index 8bd3d9fd54b3a7604a2ffd21621b3daad92638df..607c627462d74ae7c6b9b7ad68963a47076726ef 100644 (file)
@@ -3130,10 +3130,13 @@ mono_insert_safepoints (MonoCompile *cfg)
        if (cfg->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE) {
                WrapperInfo *info = mono_marshal_get_wrapper_info (cfg->method);
 
-               if (info && info->subtype == WRAPPER_SUBTYPE_ICALL_WRAPPER && info->d.icall.func == mono_thread_interruption_checkpoint) {
+               if (info && info->subtype == WRAPPER_SUBTYPE_ICALL_WRAPPER &&
+                       (info->d.icall.func == mono_thread_interruption_checkpoint ||
+                       info->d.icall.func == mono_threads_finish_blocking ||
+                       info->d.icall.func == mono_threads_reset_blocking_start)) {
                        /* These wrappers are called from the wrapper for the polling function, leading to potential stack overflow */
                        if (cfg->verbose_level > 1)
-                               printf ("SKIPPING SAFEPOINTS for the interruption checkpoint icall\n");
+                               printf ("SKIPPING SAFEPOINTS for wrapper %s\n", cfg->method->name);
                        return;
                }
        }