Re: kqueue timer interval fence post error?
Re: kqueue timer interval fence post error?
- Subject: Re: kqueue timer interval fence post error?
- From: Paul Albrecht <email@hidden>
- Date: Thu, 19 Jul 2012 09:27:10 -0500
On Wed, 2012-07-18 at 12:40 -0500, Shantonu Sen wrote:
> <http://www.opensource.apple.com/source/xnu/xnu-1699.26.8/>
>
> Timers can skew for a variety of reasons, including system load, and power management. Considering that 20ms isn't that much more than a scheduling quantum, actual delivery of notifications can vary widely, especially on UP systems.
>
Hi Shantonu,
Forgot to cc the list when I replied so again...
I don't think any of the reasons you cited account for kqueue periodic
timer lag because I can get acceptable 20 msec timing using either linux
or freebsd w/fix timers.
Here's a link to the thread I mentioned in the previous post on the
free-bsd hackers list:
http://lists.freebsd.org/pipermail/freebsd-hackers/2012-July/039907.html
I'm not sure it's relevant because the bsd subsystem looks to me like
it's been changed to use the callout framework which is still a work in
progress on freebsd.
Does the callout framework used in the bsd subsystem preclude accurate
timing or is there some other issue?
> Shantonu
>
> On Jul 18, 2012, at 7:21 AM, Paul Albrecht <email@hidden> wrote:
>
> > Hi,
> >
> > Doesn't seem like the kqueue timer works correctly on os x. When I use
> > the timer on my mac it consistently runs slow. Here's some test code:
> >
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <string.h>
> > #include <unistd.h>
> > #include <errno.h>
> > #include <sys/types.h>
> > #include <sys/event.h>
> > #include <sys/time.h>
> >
> > int
> > main(void)
> > {
> > int i,msec;
> > int kq,nev;
> > struct kevent inqueue;
> > struct kevent outqueue;
> > struct timeval start,end;
> >
> > if ((kq = kqueue()) == -1) {
> > fprintf(stderr, "kqueue error!? errno = %s", strerror(errno));
> > exit(EXIT_FAILURE);
> > }
> > EV_SET(&inqueue, 1, EVFILT_TIMER, EV_ADD | EV_ENABLE, 0, 20, 0);
> >
> > gettimeofday(&start, 0);
> > for (i = 0; i < 50; i++) {
> > if ((nev = kevent(kq, &inqueue, 1, &outqueue, 1, NULL)) == -1) {
> > fprintf(stderr, "kevent error!? errno = %s", strerror(errno));
> > exit(EXIT_FAILURE);
> > } else if (outqueue.flags & EV_ERROR) {
> > fprintf(stderr, "EV_ERROR: %s\n", strerror(outqueue.data));
> > exit(EXIT_FAILURE);
> > }
> > }
> > gettimeofday(&end, 0);
> >
> > msec = ((end.tv_sec - start.tv_sec) * 1000) + (((1000000 + end.tv_usec - start.tv_usec) / 1000) - 1000);
> >
> > printf("msec = %d\n", msec);
> >
> > close(kq);
> > return EXIT_SUCCESS;
> > }
> >
> > I originally noticed the problem on freebsd. After I posted to the
> > freebsd-hackers mailing list I got a fix, but that doesn't do much good
> > on my mac since I don't have the source.
> >
> > --
> > Paul Albrecht
> >
> > _______________________________________________
> > Do not post admin requests to the list. They will be ignored.
> > Darwin-kernel mailing list (email@hidden)
> > Help/Unsubscribe/Update your Subscription:
> >
> > This email sent to email@hidden
>
--
Paul Albrecht
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-kernel mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden