From: Rodrigo Kumpera Date: Fri, 3 Mar 2017 18:15:49 +0000 (-0800) Subject: [runtime] Make sure we use lower numbered signals on Android. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;ds=sidebyside;h=3a5adbd2aff0e0f72ceb58f4d953c1a552cb6a9e;p=mono.git [runtime] Make sure we use lower numbered signals on Android. 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. --- diff --git a/mono/utils/mono-threads-posix-signals.c b/mono/utils/mono-threads-posix-signals.c index c19ef8fe402..a4de7746d9f 100644 --- a/mono/utils/mono-threads-posix-signals.c +++ b/mono/utils/mono-threads-posix-signals.c @@ -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