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

Ivan Gerasimov ivan.gerasimov at oracle.com
Tue Feb 25 14:22:27 UTC 2014


Thank you Mike!

On 24.02.2014 22:26, Mike Duigou wrote:
> 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)
Yes, this is much clearer.
Though I used the opposite conversion: NANOSECONDS.toMillis(end - start);

Would you please take a look at the updated webrev:
http://cr.openjdk.java.net/~igerasim/6853696/1/webrev/

Sincerely yours,
Ivan

>
>> 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