< prev index next >

test/java/lang/ref/ReferenceEnqueuePending.java

Print this page
rev 13558 : [mq]: fix_test
rev 13559 : [mq]: inc1

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -92,39 +92,56 @@
             // our next trip around the loop.
             weaky = new NumberedWeakReference(obj, refQueue, i);
         }
 
         // Do a final collection to discover and process all
-        // Reference objects created above, allowing enough time
+        // Reference objects created above, allowing some time
         // for the ReferenceHandler thread to queue the References.
         forceGc(100);
         forceGc(100);
 
         // Verify that all WeakReference objects ended up queued.
-        checkResult(refQueue, obj, iterations-1);
+        checkResult(refQueue, iterations-1);
+
+        // Ensure the final weaky is live but won't be enqueued during
+        // result checking, by ensuring its referent remains live.
+        // This eliminates behavior changes resulting from different
+        // compiler optimizations.
+        Reference.reachabilityFence(weaky);
+        Reference.reachabilityFence(obj);
+
         System.out.println("Test passed.");
     }
 
+    private static NumberedWeakReference waitForReference(ReferenceQueue<Integer> queue) {
+        try {
+            return (NumberedWeakReference) queue.remove(30000); // 30sec
+        } catch (InterruptedException ie) {
+            return null;
+        }
+    }
+
     private static void checkResult(ReferenceQueue<Integer> queue,
-                                    Integer obj,
                                     int expected) {
         if (debug) {
             System.out.println("Reading the queue");
         }
 
         // Empty the queue and record numbers into a[];
-        NumberedWeakReference weakRead = (NumberedWeakReference) queue.poll();
+        NumberedWeakReference weakRead = waitForReference(queue);
         int length = 0;
         while (weakRead != null) {
             a[length++] = weakRead.number;
+            if (length < expected) {
+                weakRead = waitForReference(queue);
+            } else {            // Check for unexpected extra entries.
             weakRead = (NumberedWeakReference) queue.poll();
         }
+        }
         if (debug) {
             System.out.println("Reference Queue had " + length + " elements");
         }
-        // Use the last Reference object of those created above, so as to keep it "alive".
-        System.out.println("I must write " + obj + " to prevent compiler optimizations.");
 
 
         // verify the queued references: all but the last Reference object
         // should have been in the queue.
         if (debug) {
< prev index next >