Poll with zero or negative timeout
Jean-Christian de Rivaz
jc at eclis.ch
Tue Oct 23 10:06:08 UTC 2007
Joakim Tjernlund a écrit :
>> Index: libc/sysdeps/linux/common/poll.c
>> ===================================================================
>> --- libc/sysdeps/linux/common/poll.c (revision 20316)
>> +++ libc/sysdeps/linux/common/poll.c (working copy)
>> @@ -37,8 +37,14 @@
>> if (timeout > 0) {
>> tval.tv_sec = timeout / 1000;
>> tval.tv_nsec = (timeout % 1000) * 1000000;
>> - ts = &tval;
>> + } else if (timeout == 0) {
>> + tval.tv_sec = 0;
>> + tval.tv_nsec = 0;
>> + } else {
>> + tval.tv_sec = -1;
>> + tval.tv_nsec = 0;
>> }
>> + ts = &tval;
>> return ppoll(fds, nfds, ts, NULL);
>> }
>
> can't you just do:
> if (timeout >= 0) {
> tval.tv_sec = timeout / 1000;
> tval.tv_nsec = (timeout % 1000) * 1000000;
> ts = &tval;
> or is the timeout=0 case performance sensitive?
Yes it should work. But as the test for positive value already exists we
can use it to bypass a division, a modulo, and a multiplication of a
zero value. On a Blackfin processor for example a division is really slow.
>
> And why not pass NULL as it was before?
> } else {
> tval.tv_sec = -1; /* ~0 instead ? */
> tval.tv_nsec = 0;
> }
> ts = &tval;
Because it's not obviouse that the kernel will do the same for a null
pointer or a negative value. I don't have the POSIX.1-2001 to verify
what is exactly specified in case of a null pointer.
The constant ~0 should work, but I find far more readable the -1.
More information about the uClibc
mailing list