[Prev][Next][Index][Thread]
Re: sleep function
Dear Leigh Stoller.
Leigh Stoller wrote:
> > From: Andrew Lipnitsky <ert@cit.org.by>
> > Subject: Re: sleep function
> > Date: Wed, 25 Apr 2001 17:30:33 +0300
> >
> > > Well, thats odd. What happens when you try to make the timer or timer_com
> > > example in examples/x86 directory? Do they run okay?
> >
> > Timer, timer_com and timer_com2 examples work as expected.
>
> Sorry for the delay. I was out of the office for a few days.
>
> So, the problem is rather embarassing. The minimal C library impl of sleep
> does a clock spin, which means it is based on the oskit clock interface,
> which implements spin in terms of the oskit timer interface (which is the
> actual interface to the raw hardware). I know, sounds contorted.
>
> The problem is that the timer spin function is limited to 2^32 nanoseconds,
> so the longest sleep you get is kinda short! You can either switch to the
> FreeBSD C library (typically my choice for any oskit work),
File "include/oskit/freebsd/sys/inttypes.h" includes "machine/ansi.h". But
there is not ansi.h file in the oskit-20000505. So this approach does not work.
> or you can
> apply this incredibly simple (and in this case, incredibly stupid) patch to
> libc/gen/sleep.c.
>
> Hope this works for ya.
> Lbs
>
> Index: sleep.c
> ===================================================================
> RCS file: /usr/lsrc/flux/CVS/oskit/libc/gen/sleep.c,v
> retrieving revision 1.1
> diff -c -r1.1 sleep.c
> *** sleep.c 1999/04/22 18:56:28 1.1
> --- sleep.c 2001/04/27 16:39:41
> ***************
> *** 27,37 ****
> if (!sys_clock && !posixlib_clock_init())
> return seconds;
>
> ! time.tv_nsec = 0;
> ! time.tv_sec = seconds;
>
> ! oskit_clock_spin(sys_clock, &time);
>
> return 0;
> }
>
> --- 27,44 ----
> if (!sys_clock && !posixlib_clock_init())
> return seconds;
>
> ! /*
> ! * oskit_clock_spin based on osenv_timer_spin, which is limited
> ! * to 2^32 nanoseconds.
> ! */
> ! while (seconds) {
> ! time.tv_nsec = 0;
> ! time.tv_sec = 1;
>
> ! oskit_clock_spin(sys_clock, &time);
>
> + seconds--;
> + }
> return 0;
> }
>
This works. Thank you very much.
Andrew Lipnitsky.
References: