JDK 9 RFR of 8165664: (ch) sun.nio.ch.SocketAdaptor does not respect timeout in case of system date/time change and blocks
Brian Burkhalter
brian.burkhalter at oracle.com
Tue Dec 20 01:03:29 UTC 2016
On Dec 19, 2016, at 4:03 PM, David M. Lloyd <david.lloyd at redhat.com> wrote:
> Two things - IIRC it is possible on some systems for System.nanoTime() appear to move backwards (right?), thus you want to change "nanoTime() - startTime" constructs to be "max(0, nanoTime() - startTime)" (you can use 1 instead if you want to always make progress).
>
> The other thing is to Martin's point, for posterity mainly because I'm sure this was just an oversight: you can't use a nanoTime() value (or a value based on it) as a deadline because it can wrap around at an unspecified point in time, causing deadline comparisons to fail (once you wrap around, you'll be < any likely deadline probably for a very long time).
>
> What you *can* do is get a nanoTime() "snapshot" into a constant field; then you can get an "absolute" nanoTime anytime you want (as long as you don't expect your program's uptime to exceed about 584 years) by doing: max(0, nanoTime() - startTime).
>
> On 12/19/2016 04:26 PM, Roger Riggs wrote:
>> Looks good.
>>
>> $.02, Roger
>>
>>
>> On 12/19/2016 5:14 PM, Brian Burkhalter wrote:
>>> An updated patch which passes regression tests is here:
>>>
>>> http://cr.openjdk.java.net/~bpb/8165664/webrev.01/
>>>
>>> Thanks,
>>>
>>> Brian
>>>
>>> On Dec 19, 2016, at 12:08 PM, Martin Buchholz <martinrb at google.com>
>>> wrote:
>>>
>>>> It's unfortunate the use of int millis timeout is baked into the API.
>>>>
>>>> It's probably best (and traditional) to work with an internal long
>>>> nanos field anyways, so there are no millisecond sized roundoff errors.
>>>>
>>>> I sometimes find it easier to understand if I define a deadline
>>>> final long deadline = System.nanoTime() + nanosTimeout;
>>>>
>>>> I would do unit conversions using methods from TimeUnit.
>>
>
> --
> - DML
More information about the nio-dev
mailing list