alarm return value is wrong in 4.2bsd
Bill Shannon
shannon at sun.uucp
Thu Mar 22 10:59:08 AEST 1984
Index: lib/libc/gen/alarm.c 4.2BSD
Description:
alarm (which is implemented using setitimer) can sometimes lie
and return zero even when there is an alarm pending. This
screws up people who do:
left = alarm(0); /* turn alarm off */
diddle, diddle, diddle...
alarm(left); /* turn it back on */
Repeat-By:
See above.
Fix:
The problem is that the interval timer has higher resolution
than alarm and alarm truncates the value. I fixed it to round
up. Diffs follow.
*** /tmp/d02314 Wed Mar 21 16:30:17 1984
--- alarm.c Wed Mar 21 16:29:59 1984
***************
*** 18,22
itp->it_value.tv_usec = 0;
if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
return (-1);
return (oitv.it_value.tv_sec);
}
--- 18,24 -----
itp->it_value.tv_usec = 0;
if (setitimer(ITIMER_REAL, itp, &oitv) < 0)
return (-1);
+ if (oitv.it_value.tv_usec)
+ oitv.it_value.tv_sec++;
return (oitv.it_value.tv_sec);
}
Bill Shannon
sun!shannon
Sun Microsystems, Inc.
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list