timer_settime doesn't fill siginfo_t
Marek Prochazka
Marek.Prochazka at scisys.co.uk
Tue Feb 27 18:49:31 UTC 2007
It seems to me that RTEMS implementation of POSIX timers just does not
pass the sigev_value data structure at all. It saves the value in the
timer_create():
ptimer1.c:
if ( evp != NULL ) {
timer_struct[timer_pos].inf.sigev_notify = evp->sigev_notify;
timer_struct[timer_pos].inf.sigev_signo = evp->sigev_signo;
timer_struct[timer_pos].inf.sigev_value = evp->sigev_value;
}
But in FIRE_TIMER_S(), which is the function called when a timer
expires, pthread_kill() is used and this obviously only passes signal
number and not other values which should be passed (e.g. si_code ==
SI_TIMER, and also the sigev_value).
A question for RTEMS experts is whether this could be fixed somehow.
Marek
> -----Original Message-----
> From:
> rtems-users-bounces+marek.prochazka=scisys.co.uk at rtems.org
> [mailto:rtems-users-bounces+marek.prochazka=scisys.co.uk at rtems
> .org] On Behalf Of Patricia Lopez-Cueva
> Sent: 27 February 2007 16:33
> To: rtems-users at rtems.org
> Subject: timer_settime doesn't fill siginfo_t
>
> Hi all.
>
>
>
> I'm programming an application that uses Posix timers in
> rtems. I have to pass to the signal handler information so I
> have to use SA_SIGINFO and put the information in the
> sigevent structure.
>
> The problem is that when the handler is called and I access
> to the siginfo_t parameter and in the si_value.sival_ptr the
> information I store is not there.
>
>
>
> Following it is included the code:
>
>
>
> struct sigevent t_Evp;
>
> struct sigaction t_SigAction;
>
>
>
> /* Initialise signal handler */
>
> sigemptyset(&t_SigAction.sa_mask);
>
> t_SigAction.sa_flags = SA_SIGINFO;
>
> t_SigAction.sa_sigaction = &SignalHandler;
>
> if (0 != sigaction(SIGUSR1, &t_SigAction, NULL))
>
> {
>
> ERROR("Failed to install signal handler using
> sigaction\n");
>
> return G_STATUS_FAILURE;
>
> }
>
>
>
> /* Create timer */
>
> DEBUG("Creating POSIX timer\n");
>
> t_Evp.sigev_notify = SIGEV_SIGNAL;
>
> t_Evp.sigev_signo = SIGUSR1;
>
> t_Evp.sigev_value.sival_ptr = &pt_Timer;
>
> if (0 != (i_Status = timer_create(CLOCK_REALTIME,
> &t_Evp, &pt_Timer)))
>
> {
>
> ERROR("Failed to create timer using timer_create\n");
>
> switch (errno)
>
> {
>
> case EAGAIN:
>
> ERROR("EAGAIN: Lacked
> necessary resources or too many timers\n");
>
> break;
>
> case EINVAL:
>
> ERROR("EINVAL: Invalid
> attributes or clock id\n");
>
> break;
>
> default:
>
> ERROR1("Unknown error = %d\n", errno);
>
> }
>
> errno = 0;
>
> return G_STATUS_FAILURE;
>
> }
>
>
>
> static void SignalHandler(
>
> int i_Signo,
>
> siginfo_t * pt_Info,
>
> void * pv_Context);
>
>
>
> Is there any error in the code? Someone knows why it happens?
>
>
>
> Many thanks
>
> Patricia
>
>
>
>
>
>
More information about the users
mailing list