ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/concurrent/Phaser.java
(Generate patch)

Comparing jsr166/src/main/java/util/concurrent/Phaser.java (file contents):
Revision 1.51 by jsr166, Sat Dec 4 22:00:05 2010 UTC vs.
Revision 1.52 by jsr166, Wed Dec 8 08:11:26 2010 UTC

# Line 271 | Line 271 | public class Phaser {
271      private static final int  MAX_PHASE       = 0x7fffffff;
272      private static final int  PARTIES_SHIFT   = 16;
273      private static final int  PHASE_SHIFT     = 32;
274 +    private static final long PHASE_MASK      = -1L << PHASE_SHIFT;
275      private static final int  UNARRIVED_MASK  = 0xffff;      // to mask ints
276      private static final long PARTIES_MASK    = 0xffff0000L; // to mask longs
277      private static final long TERMINATION_BIT = 1L << 63;
# Line 438 | Line 439 | public class Phaser {
439       * Resolves lagged phase propagation from root if necessary.
440       */
441      private long reconcileState() {
442 <        Phaser rt = root;
442 >        final Phaser root = this.root;
443          long s = state;
444 <        if (rt != this) {
445 <            int phase;
446 <            while ((phase = (int)(rt.state >>> PHASE_SHIFT)) !=
447 <                   (int)(s >>> PHASE_SHIFT)) {
448 <                // assert phase < 0 || unarrivedOf(s) == 0
449 <                long t;                             // to reread s
450 <                long p = s & PARTIES_MASK;          // unshifted parties field
451 <                long n = (((long) phase) << PHASE_SHIFT) | p;
452 <                if (phase >= 0) {
453 <                    if (p == 0L)
453 <                        n |= EMPTY;                 // reset to empty
454 <                    else
455 <                        n |= p >>> PARTIES_SHIFT;   // set unarr to parties
456 <                }
457 <                if ((t = state) == s &&
458 <                    UNSAFE.compareAndSwapLong(this, stateOffset, s, s = n))
459 <                    break;
460 <                s = t;
444 >        if (root != this) {
445 >            for (long rs; ((rs = root.state) ^ s) >>> PHASE_SHIFT != 0;) {
446 >                // assert rs < 0 || (s != state) || unarrivedOf(s) == 0;
447 >                long lp = s & PARTIES_MASK;
448 >                long n = (rs & PHASE_MASK) | lp;
449 >                if (rs >= 0)
450 >                    n |= (lp == 0L) ? EMPTY : (lp >>> PARTIES_SHIFT);
451 >                if (s == (s = state) &&
452 >                    UNSAFE.compareAndSwapLong(this, stateOffset, s, n))
453 >                    return n;
454              }
455          }
456          return s;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines