Tilghman Lesher wrote:

On Friday 27 May 2005 05:33, David Woodhouse wrote:
Using zaptel just for a time source is silly. We should use POSIX
timers instead. Here's a start, but I don't know how long it'll be
before I can get to finish it, so I thought I'd post it here in the
hope that someone else will pick it up.

As noted here:

http://lists.digium.com/pipermail/asterisk-users/2002-April/002072.html

software timers are lacking.

I think that is just narrow thinking.

app_conference works all day and week long, without any hardware support. It also does it without posix timers. It just uses nanosleep and gettimeofday.

You can make things go X times per second, with great accuracy over a long period of time with just those tools. What you can't always do is make sure that you don't have a period where you oversleep for a few ten of milliseconds. But if you keep track of time, you can just do more work when you do wake up.


i.e.  in pseudo-code

do_something_n_times_per_second(func_t something, int n) {
   long now, last, begin = getcurrentmillis();

last = begin;
   for(;;) {
       usleep(n);
time now = getcurrentmillis(); while(last < now) {
            something();
            last+=n;
       }
}
}


where getcurrentmillis() can be based on gettimeofday, of course.

This will call something() 1000/n times per second. It might not be spaced out so that it happens _exactly_ every n ms, but it will, over a particular time period, happen 1000/n times per second.

If this runs in a real-time process, and the something() takes less than n ms to run, it will happen very close to every n ms.

Of course, most things don't need to run every ms, and this will work better when n>1.

-SteveK



_______________________________________________
Asterisk-Dev mailing list
Asterisk-Dev@lists.digium.com
http://lists.digium.com/mailman/listinfo/asterisk-dev
To UNSUBSCRIBE or update options visit:
  http://lists.digium.com/mailman/listinfo/asterisk-dev

Reply via email to