On Dec 4, 2015, at 2:16 AM, Per Liden <per.li...@oracle.com> wrote: > > On 2015-12-02 19:37, Kim Barrett wrote: >> Please review this change to PhantomReference processing, changing the >> GC-based notification to automatically clear the referent. >> >> […] >> CR: >> https://bugs.openjdk.java.net/browse/JDK-8071507 >> >> Webrevs: >> http://cr.openjdk.java.net/~kbarrett/8071507/jdk.05/ > > test/java/lang/ref/PhantomReferentClearing.java: > > 85 // Delete root -> O1, collect, verify P1 notified, P2 not > notified. > 86 O1 = null; > 87 System.gc(); > 88 if (Q1.remove(ENQUEUE_TIMEOUT) == null) { > 89 throw new RuntimeException("P1 not notified by O1 deletion"); > 90 } else if (Q2.remove(ENQUEUE_TIMEOUT) != null) { > 91 throw new RuntimeException("P2 notified by O1 deletion."); > 92 } > 93 > 94 // Delete root -> O2, collect. P2 should be notified. > 95 O2 = null; > 96 System.gc(); > 97 if (Q2.remove(ENQUEUE_TIMEOUT) == null) { > 98 throw new RuntimeException("P2 not notified by O2 deletion"); > 99 } > > The calls to System.gc() isn't guaranteed to do what the test expects here. > As you know, System.gc(), might not actually do anything, depending on which > collector is used and the current circumstances (GC locker held, a concurrent > GC is already in process, etc). To make the test robust I'd suggest you call > System.gc() and check the queue in a loop, and fail after some reasonable > amount of time/iterations.
I'd rather not clutter and uglify this and other tests to deal with a problem we don't (so far as I can tell) presently actually have. If a problem does arise, the form of that problem will help guide what the solution needs to be. I suspect adding something to WhiteBox would be the proper approach, so that it can be shared with other tests of this form.