RFR: 7161229 - PriorityBlockingQueue keeps hard reference to last removed element (original) (raw)

David Holmes david.holmes at oracle.com
Mon Jun 25 11:17:18 UTC 2012


Hi Remi,

On 25/06/2012 7:01 PM, Rémi Forax wrote:

Hi David, I think the test

if (n > 0) { should not be in siftDown* but should be done at all callsites, by example in heapify, you can hoist the test outside of the loop.

I originally had it at the call-site (it already exists in a number of them) but Doug prefers it to be internalized. He wrote:

"... a better strategy is to move the n > 0 check to the siftDown code itself, so (existing and potential) callers don't need the check. ... an explicit n > 0 check acts to hoist array index checks in loop so turns out to be faster in general."

In dequeue, it's a matter of style but the 'else' is not needed anymore.

Otherwise the changes looks ok for me.

Thanks, David

Rémi

On 06/25/2012 06:26 AM, David Holmes wrote: webrev:

http://cr.openjdk.java.net/~dholmes/7161229/webrev/ When removing the last element from the PBQ the "sift down" logic would store it back in as array[0]. The simple fix is for the sift-down to be a no-op if the queue size is zero. The fix has been contributed by Doug Lea. We are taking this opportunity to synchronize PBQ with Doug's latest version at: http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/PriorityBlockingQueue.java?view=log

So in addition to the above functional fix there are a number of miscellaneous code and comment cleanups. The only non-trivial, but still very simple, change is to the drainTo method to make it more robust if the add() on the destination collection throws an exception. I am of course a Reviewer for this. I have provided the update to the LastElement test (as this is certainly related to the last element) but there are some reservations about examining the PBS internals this way. Unfortunately there is no good way to test for these kinds of retention issues. You either need a whitebox test like this, or need to rely on non-guaranteed GC and finalization behaviour. Thanks, David Holmes



More information about the core-libs-dev mailing list