Esempio n. 1
0
void
mono_threads_posix_init_signals (MonoThreadPosixInitSignals signals)
{
	sigset_t signal_set;

	g_assert ((signals == MONO_THREADS_POSIX_INIT_SIGNALS_SUSPEND_RESTART) ^ (signals == MONO_THREADS_POSIX_INIT_SIGNALS_ABORT));

	sigemptyset (&signal_set);

	switch (signals) {
	case MONO_THREADS_POSIX_INIT_SIGNALS_SUSPEND_RESTART: {
		if (mono_thread_info_unified_management_enabled ()) {
			suspend_signal_num = DEFAULT_SUSPEND_SIGNAL;
			restart_signal_num = DEFAULT_RESTART_SIGNAL;
		} else {
			suspend_signal_num = suspend_signal_get ();
			restart_signal_num = restart_signal_get ();
		}

		sigfillset (&suspend_signal_mask);
		sigdelset (&suspend_signal_mask, restart_signal_num);
		if (!mono_thread_info_unified_management_enabled ())
			sigdelset (&suspend_signal_mask, mono_gc_get_suspend_signal ());

		sigemptyset (&suspend_ack_signal_mask);
		sigaddset (&suspend_ack_signal_mask, restart_signal_num);

		signal_add_handler (suspend_signal_num, suspend_signal_handler, SA_RESTART);
		signal_add_handler (restart_signal_num, restart_signal_handler, SA_RESTART);

		sigaddset (&signal_set, suspend_signal_num);
		sigaddset (&signal_set, restart_signal_num);

		break;
	}
	case MONO_THREADS_POSIX_INIT_SIGNALS_ABORT: {
		abort_signal_num = abort_signal_get ();

		signal_add_handler (abort_signal_num, abort_signal_handler, 0);

		sigaddset (&signal_set, abort_signal_num);

		break;
	}
	default: g_assert_not_reached ();
	}

	/* ensure all the new signals are unblocked */
	sigprocmask (SIG_UNBLOCK, &signal_set, NULL);
}
Esempio n. 2
0
void
mono_threads_suspend_init_signals (void)
{
	sigset_t signal_set;

	sigemptyset (&signal_set);

	/* add suspend signal */
	suspend_signal_num = suspend_signal_get ();

	signal_add_handler (suspend_signal_num, suspend_signal_handler, SA_RESTART);

	sigaddset (&signal_set, suspend_signal_num);

	/* add restart signal */
	restart_signal_num = restart_signal_get ();

	sigfillset (&suspend_signal_mask);
	sigdelset (&suspend_signal_mask, restart_signal_num);

	sigemptyset (&suspend_ack_signal_mask);
	sigaddset (&suspend_ack_signal_mask, restart_signal_num);

	signal_add_handler (restart_signal_num, restart_signal_handler, SA_RESTART);

	sigaddset (&signal_set, restart_signal_num);

	/* add abort signal */
	abort_signal_num = abort_signal_get ();

	/* the difference between abort and suspend here is made by not
	 * passing SA_RESTART, meaning we won't restart the syscall when
	 * receiving a signal */
	signal_add_handler (abort_signal_num, suspend_signal_handler, 0);

	sigaddset (&signal_set, abort_signal_num);

	/* 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 HOST_ANDROID
	g_assert (suspend_signal_num < 32);
	g_assert (restart_signal_num < 32);
	g_assert (abort_signal_num < 32);
#endif
}