예제 #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;
}
예제 #2
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;
}
예제 #3
0
int xntrace_special(unsigned char id, unsigned long v)
{
	return XENOMAI_SYSCALL3(__xn_sys_trace, __xntrace_op_special, id, v);
}
예제 #4
0
int xntrace_user_freeze(unsigned long v, int once)
{
	return XENOMAI_SYSCALL3(__xn_sys_trace, __xntrace_op_user_freeze,
				v, once);
}
예제 #5
0
파일: timer.c 프로젝트: ChunHungLiu/xenomai
 * - EINVAL, the  member @a sigev_signo of the @b sigevent structure is an
 *   invalid signal number;
 * - EAGAIN, the maximum number of timers was exceeded, recompile with a larger
 *   value.
 *
 * @see
 * <a href="http://www.opengroup.org/onlinepubs/000095399/functions/timer_create.html">
 * Specification.</a>
 */
COBALT_IMPL(int, timer_create, (clockid_t clockid,
				const struct sigevent *__restrict__ evp,
				timer_t * __restrict__ timerid))
{
	int ret;

	ret = -XENOMAI_SYSCALL3(sc_cobalt_timer_create,	clockid, evp, timerid);
	if (ret == 0)
		return 0;

	errno = ret;

	return -1;
}

/**
 * Delete a timer object.
 *
 * This service deletes the timer @a timerid.
 *
 * @param timerid identifier of the timer to be removed;
 *