RFR [6853696] (ref) ReferenceQueue.remove(timeout) may return null even if timeout has not expired

Mike Duigou mike.duigou at oracle.com
Mon Feb 24 18:26:22 UTC 2014


On Feb 24 2014, at 06:37 , roger riggs <roger.riggs at oracle.com> wrote:

> Hi Ivan,
> 
> The code is correct as written but there might be some creep in the end time due to the sampling of System.nanoTime.
> 
> I would be inclined to calculate the final time of the timeout once
> and then compare simply with the current nanotime.
> 
> long end = (timeout == 0) ? Long.MAX_VALUE : (System.nanoTime() + timeout * 1000000);

I hate seeing numerical constants

TimeUnit.MILLISECONDS.toNanos(timeout)

> 
> Then the test in the loop can be:
> 
>  if (System.nanoTime() > end) {
>     return null;
>  }

This compare should be re-written in the overflow compensating style Martin mentions.

Mike

> 
> Roger (Not a Reviewer)
> 
> On 2/24/2014 12:59 AM, Ivan Gerasimov wrote:
>> Hello!
>> 
>> ReferenceQueue.remove(timeout) may return too early, i.e. before the specified timeout has elapsed.
>> 
>> Would you please review the fix?
>> The change also includes a regression test, which can be used to demonstrate the issue.
>> 
>> BUGURL: https://bugs.openjdk.java.net/browse/JDK-6853696
>> WEBREV: http://cr.openjdk.java.net/~igerasim/6853696/0/webrev/
>> 
>> Sincerely yours,
>> Ivan
> 




More information about the core-libs-dev mailing list