[runtime] Make sure we use lower numbered signals on Android.
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 3 Mar 2017 18:15:49 +0000 (10:15 -0800)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 8 Mar 2017 23:34:38 +0000 (15:34 -0800)
Android on 32bits arm shipped broken headers that made sigset_t be 32 bits instead of 64.

This means that it's not possible to use signals whose value are >= 32. The default implementation
uses RT signals when available (and they are on Android). But RT signals don't work as expected
as their value is >= 32.

This fix hardcodes some safe signals on Android and add asserts about their values to avoid regressions.

See 5005c6f3fbc1da584c6a550281689cc23f59fe6d for more details.

mono/utils/mono-threads-posix-signals.c

index c19ef8fe402d6dc557057a5088bdc133bec9c218..a4de7746d9f0de61b0f7870c79608aa330f3be56 100644 (file)
@@ -80,7 +80,9 @@ abort_signal_get (void)
 static int
 suspend_signal_get (void)
 {
-#ifdef SIGRTMIN
+#if defined(PLATFORM_ANDROID)
+       return SIGPWR;
+#elif defined (SIGRTMIN)
        static int suspend_signum = -1;
        if (suspend_signum == -1)
                suspend_signum = mono_threads_suspend_search_alternative_signal ();
@@ -97,7 +99,9 @@ suspend_signal_get (void)
 static int
 restart_signal_get (void)
 {
-#ifdef SIGRTMIN
+#if defined(PLATFORM_ANDROID)
+       return SIGXCPU;
+#elif defined (SIGRTMIN)
        static int restart_signum = -1;
        if (restart_signum == -1)
                restart_signum = mono_threads_suspend_search_alternative_signal ();
@@ -236,6 +240,16 @@ mono_threads_suspend_init_signals (void)
 
        /* ensure all the new signals are unblocked */
        sigprocmask (SIG_UNBLOCK, &signal_set, NULL);
+
+       /*
+       On 32bits arm Android, signals with values >=32 are not usable as their headers ship a broken sigset_t.
+       See 5005c6f3fbc1da584c6a550281689cc23f59fe6d for more details.
+       */
+#ifdef PLATFORM_ANDROID
+       g_assert (suspend_signal_num < 32);
+       g_assert (restart_signal_num < 32);
+       g_assert (abort_signal_num < 32);
+#endif
 }
 
 gint