--- jsr166/src/jsr166y/Phaser.java 2009/07/26 05:55:34 1.21 +++ jsr166/src/jsr166y/Phaser.java 2009/07/27 20:57:44 1.23 @@ -675,9 +675,9 @@ public class Phaser { } /** - * Returns the parent of this phaser, or null if none. + * Returns the parent of this phaser, or {@code null} if none. * - * @return the parent of this phaser, or null if none + * @return the parent of this phaser, or {@code null} if none */ public Phaser getParent() { return parent; @@ -706,12 +706,12 @@ public class Phaser { * Overridable method to perform an action upon phase advance, and * to control termination. This method is invoked whenever the * barrier is tripped (and thus all other waiting parties are - * dormant). If it returns true, then, rather than advance the - * phase number, this barrier will be set to a final termination - * state, and subsequent calls to {@code isTerminated} will - * return true. + * dormant). If it returns {@code true}, then, rather than advance + * the phase number, this barrier will be set to a final + * termination state, and subsequent calls to {@link #isTerminated} + * will return true. * - *
The default version returns true when the number of + *
The default version returns {@code true} when the number of
* registered parties is zero. Normally, overrides that arrange
* termination for other reasons should also preserve this
* property.
@@ -930,16 +930,47 @@ public class Phaser {
return p;
}
- // Unsafe mechanics for jsr166y 3rd party package.
+ // Unsafe mechanics
+
+ private static final sun.misc.Unsafe UNSAFE = getUnsafe();
+ private static final long stateOffset =
+ objectFieldOffset("state", Phaser.class);
+
+ private final boolean casState(long cmp, long val) {
+ return UNSAFE.compareAndSwapLong(this, stateOffset, cmp, val);
+ }
+
+ private static long objectFieldOffset(String field, Class> klazz) {
+ try {
+ return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
+ } catch (NoSuchFieldException e) {
+ // Convert Exception to corresponding Error
+ NoSuchFieldError error = new NoSuchFieldError(field);
+ error.initCause(e);
+ throw error;
+ }
+ }
+
+ /**
+ * Returns a sun.misc.Unsafe. Suitable for use in a 3rd party package.
+ * Replace with a simple call to Unsafe.getUnsafe when integrating
+ * into a jdk.
+ *
+ * @return a sun.misc.Unsafe
+ */
private static sun.misc.Unsafe getUnsafe() {
try {
return sun.misc.Unsafe.getUnsafe();
} catch (SecurityException se) {
try {
return java.security.AccessController.doPrivileged
- (new java.security.PrivilegedExceptionAction