This is actualy very interesting. Riped the parts from periodic.c
to play a with the code to see how it reacts to some changes.
The code below reproduces the problem:
sleep()+0x7 /sys/src/libc/9syscall/sleep.s:5
periodicThread(msec=0x3e8)+0xb2 /tmp/a.c:21
ct=0x47a68e5b
t=0x47e50e4d
ts=0x0
main()+0x10 /tmp/a.c:32
_main+0x31 /sys/src/libc/386/main9.s:16
The zerosleeps go away if one uncomments the foo print. It also
goes away if one makes the sleep one milli second longer by
changing ts to ts+1.
I would love if anybody gives a good explaination of this bug
and how to fix it :-)
#include <u.h>
#include <libc.h>
static void
periodicThread(int msec)
{
double t, ct, ts;
ct = nsec()*1e-6;
t = ct + msec;
for(;;){
/* skip missed */
while(t <= ct)
t += msec;
ts = t - ct;
if(ts > 1000)
ts = 1000;
sleep(ts);
ct = nsec()*1e-6;
if(t <= ct){
// print("foo!\n");
t += msec;
}
}
}
void
main(int argc, char *argv[])
{
periodicThread(1000);
}
--- Begin Message ---
> Can anybody explain this fossil behaviour from the periodic code?
what if 0 < t - ct < 1?
wouldn't it be a good idea to replace the doubles with vlongs?
and replace *1e-6 with /1000000? that would make 0 < t - ct < 1
impossible.
- erik
--- End Message ---