Example #1
0
/*
 * The following handler is part of the inner user-interface: should
 * remain extern.
 */
int cobalt_sigshadow_handler(int sig, siginfo_t *si, void *ctxt)
{
	void *frames[SIGSHADOW_BACKTRACE_DEPTH];
	int action, arg, nr, skip;

	if (si->si_code != SI_QUEUE)
		return 0;

	action = sigshadow_action(si->si_int);

	switch (action) {
	case SIGSHADOW_ACTION_HARDEN:
		XENOMAI_SYSCALL1(sc_cobalt_migrate, COBALT_PRIMARY);
		break;
	case SIGSHADOW_ACTION_BACKTRACE:
		arg = sigshadow_arg(si->si_int);
		nr = backtrace(frames, sizeof(frames) / sizeof(frames[0]));
		/* Skip the sighandler context. */
		skip = nr > 3 ? 3 : 0;
		XENOMAI_SYSCALL3(sc_cobalt_backtrace, nr - skip, frames + skip, arg);
		break;
	default:
		return 0;
	}

	return 1;
}
Example #2
0
int xeno_sigwinch_handler(int sig, siginfo_t *si, void *ctxt)
{
	int action;

	if (si->si_code != SI_QUEUE)
		return 0;

	action = sigshadow_action(si->si_int);

	switch(action) {
	case SIGSHADOW_ACTION_HARDEN:
		XENOMAI_SYSCALL1(__xn_sys_migrate, XENOMAI_XENO_DOMAIN);
		break;

	case SIGSHADOW_ACTION_RENICE: {
		struct sched_param param;
		int policy;

		param.sched_priority = sigshadow_arg(si->si_int);
		policy = param.sched_priority > 0 ? SCHED_FIFO: SCHED_OTHER;
		pthread_setschedparam(pthread_self(), policy, &param);
		break;
	}

	default:
		return 0;
	}

	return 1;
}
Example #3
0
/*
 * The following handler is part of the inner user-interface: should
 * remain extern.
 */
int xeno_sigwinch_handler(int sig, siginfo_t *si, void *ctxt)
{
	void *frames[SIGSHADOW_BACKTRACE_DEPTH];
	int action, arg, nr, skip;

	if (si->si_code != SI_QUEUE)
		return 0;

	action = sigshadow_action(si->si_int);
	switch(action) {
	case SIGSHADOW_ACTION_HARDEN:
		XENOMAI_SYSCALL1(__xn_sys_migrate, XENOMAI_XENO_DOMAIN);
		break;

	case SIGSHADOW_ACTION_RENICE: {
		struct sched_param param;
		int policy;

		arg = sigshadow_arg(si->si_int);
		param.sched_priority = arg;
		policy = param.sched_priority > 0 ? SCHED_FIFO: SCHED_OTHER;
		pthread_setschedparam(pthread_self(), policy, &param);
		break;
	}

	case SIGSHADOW_ACTION_BACKTRACE:
		arg = sigshadow_arg(si->si_int);
		nr = backtrace(frames, sizeof(frames) / sizeof(frames[0]));
		/* Skip the sighandler context. */
		skip = nr > 3 ? 3 : 0;
		XENOMAI_SYSCALL3(__xn_sys_backtrace, nr - skip, frames + skip, arg);
		break;

	default:
		return 0;
	}

	return 1;
}