utimensat UTIME_NOW granularity bug

Christopher Faylor cgf-use-the-mailinglist-please@cygwin.com
Mon Oct 12 15:02:00 GMT 2009


On Fri, Oct 09, 2009 at 06:45:51AM -0600, Eric Blake wrote:
>-----BEGIN PGP SIGNED MESSAGE-----
>Hash: SHA1
>
>According to Christopher Faylor on 10/8/2009 10:58 PM:
>> 
>> I don't like "MILLION" or "BILLION".  I think a real number is clearer
>> for that.  Maybe it's jsut me but when I see million I can't help myself
>> from checking to see if it's 1000000 or 1024*1024.  And, if you're going
>> to assign constants to 1 with a bunch of zeros where do you draw the
>> line?
>
>OK, here's the respin without the churn.
>
>> 
>> It looks like you either don't need the systime() call or it should
>> call systime_ns.
>
>Done.  hires_us still uses systime().
>
>> 
>>>       long long x = time_in->tv_sec * NSPERSEC +
>>> -			    time_in->tv_nsec / (NSPERSEC/100000) + FACTOR;
>>> +			    time_in->tv_nsec / (BILLION / NSPERSEC) + FACTOR;
>> 
>> I'm too tired now to figure out why you switched these but it seems
>> odd that you switched the numerator and denominator  here but
>> 
>>>   long long x = time_in->tv_sec * NSPERSEC +
>>> -			time_in->tv_usec * (NSPERSEC/1000000) + FACTOR;
>>> +			time_in->tv_usec * (NSPERSEC / MILLION) + FACTOR;
>
>Because the number 100000 is unrelated to anything else in this file; just
>because NSPERSEC/1000000 gives the right answer doesn't mean it expresses
>the right equation.  We are really calculating these two values:
>
>tv_nsec / 100 (nsecs) - scaling down
>tv_nsec * 10 (usecs) - scaling up
>
>so that x will be in terms of 100ns ticks.  The relations should be:
>
>/ 100 = 1000000000/NSPERSEC = 1000000000/10000000
>*  10 =   NSPERSEC/1000000  =   10000000/1000000
>
>since NSPERSEC falls in between nanoseconds and microseconds.


I'm still not convinced that this switch makes anything clearer but, that's ok.

Please check in.

Thanks.

cgf



More information about the Cygwin-patches mailing list