[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: kernel/2182: virtual interval timers always one-shot
The following reply was made to PR kernel/2182; it has been noted by GNATS.
From: Theo de Raadt <deraadt@cvs.openbsd.org>
To: cb@mit.edu
Cc: gnats@openbsd.org
Subject: Re: kernel/2182: virtual interval timers always one-shot
Date: Sat, 17 Nov 2001 17:44:37 -0700
Seems to work fine from what I see. Would have helped if you had
included a test program which fails, because mine seems to work.
Your comment about kern_time.c not even using it_interval is wrong
too, as grep will show.
Perhaps you did not read this paragraph:
If it_value is non-zero, it indicates the time to the next timer expira-
tion. If it_interval is non-zero, it specifies a value to be used in
reloading it_value when the timer expires. Setting it_value to 0 dis-
ables a timer. Setting it_interval to 0 causes a timer to be disabled
after its next expiration (assuming it_value is non-zero).
There does seem to be something strange with very small values of
it_interval, in particular, when the time is < 10000 usec.
---
#include <sys/types.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
void
timer(int sigval)
{
int save_errno = errno;
write(STDOUT_FILENO, ".", 1);
errno = save_errno;
}
main()
{
struct itimerval tvi;
struct sigaction sa;
tvi.it_interval.tv_sec = 1;
tvi.it_interval.tv_usec = 0;
tvi.it_value.tv_sec = 1;
tvi.it_value.tv_usec = 0;
memset(&sa, 0, sizeof sa);
sigemptyset(&sa);
sa.sa_handler = timer;
sa.sa_flags = SA_RESTART;
sigaction(SIGVTALRM, &sa, NULL);
setitimer(ITIMER_VIRTUAL, &tvi, NULL);
while (1)
;
}