ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166y/LinkedTransferQueue.java
(Generate patch)

Comparing jsr166/src/jsr166y/LinkedTransferQueue.java (file contents):
Revision 1.63 by jsr166, Mon Nov 2 05:08:48 2009 UTC vs.
Revision 1.64 by jsr166, Mon Nov 2 06:12:02 2009 UTC

# Line 479 | Line 479 | public class LinkedTransferQueue<E> exte
479      }
480  
481      /*
482 <     * Possible values for "how" argument in xfer method. Beware that
483 <     * the order of assigned numerical values matters.
482 >     * Possible values for "how" argument in xfer method.
483       */
484      private static final int NOW     = 0; // for untimed poll, tryTransfer
485      private static final int ASYNC   = 1; // for offer, put, add
# Line 537 | Line 536 | public class LinkedTransferQueue<E> exte
536                  p = (p != n) ? n : (h = head); // Use head if p offlist
537              }
538  
539 <            if (how != NOW) {                  // No matches available
539 >            if (how != NOW) {                 // No matches available
540                  if (s == null)
541                      s = new Node(e, haveData);
542                  Node pred = tryAppend(s, haveData);
543                  if (pred == null)
544                      continue retry;           // lost race vs opposite mode
545 <                if (how >= SYNC)
546 <                    return awaitMatch(s, pred, e, how, nanos);
545 >                if (how != ASYNC)
546 >                    return awaitMatch(s, pred, e, (how == TIMEOUT), nanos);
547              }
548              return e; // not waiting
549          }
# Line 593 | Line 592 | public class LinkedTransferQueue<E> exte
592       * predecessor, or null if unknown (the null case does not occur
593       * in any current calls but may in possible future extensions)
594       * @param e the comparison value for checking match
595 <     * @param how either SYNC or TIMEOUT
595 >     * @param timed if true, wait only until timeout elapses
596       * @param nanos timeout value
597       * @return matched item, or e if unmatched on interrupt or timeout
598       */
599 <    private E awaitMatch(Node s, Node pred, E e, int how, long nanos) {
600 <        long lastTime = (how == TIMEOUT) ? System.nanoTime() : 0L;
599 >    private E awaitMatch(Node s, Node pred, E e, boolean timed, long nanos) {
600 >        long lastTime = timed ? System.nanoTime() : 0L;
601          Thread w = Thread.currentThread();
602          int spins = -1; // initialized after first item and cancel checks
603          ThreadLocalRandom randomYields = null; // bound if needed
# Line 610 | Line 609 | public class LinkedTransferQueue<E> exte
609                  s.forgetContents();           // avoid garbage
610                  return this.<E>cast(item);
611              }
612 <            if ((w.isInterrupted() || (how == TIMEOUT && nanos <= 0)) &&
612 >            if ((w.isInterrupted() || (timed && nanos <= 0)) &&
613                      s.casItem(e, s)) {       // cancel
614                  unsplice(pred, s);
615                  return e;
# Line 629 | Line 628 | public class LinkedTransferQueue<E> exte
628              else if (s.waiter == null) {
629                  s.waiter = w;                 // request unpark then recheck
630              }
631 <            else if (how == TIMEOUT) {
631 >            else if (timed) {
632                  long now = System.nanoTime();
633                  if ((nanos -= now - lastTime) > 0)
634                      LockSupport.parkNanos(this, nanos);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines