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.62 by jsr166, Mon Nov 2 03:01:10 2009 UTC vs.
Revision 1.65 by jsr166, Mon Nov 2 15:32:00 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
486 <    private static final int SYNC    = 2; // for transfer, take
487 <    private static final int TIMEOUT = 3; // for timed poll, tryTransfer
484 >    private static final int NOW   = 0; // for untimed poll, tryTransfer
485 >    private static final int ASYNC = 1; // for offer, put, add
486 >    private static final int SYNC  = 2; // for transfer, take
487 >    private static final int TIMED = 3; // for timed poll, tryTransfer
488  
489      @SuppressWarnings("unchecked")
490      static <E> E cast(Object item) {
# Line 498 | Line 497 | public class LinkedTransferQueue<E> exte
497       *
498       * @param e the item or null for take
499       * @param haveData true if this is a put, else a take
500 <     * @param how NOW, ASYNC, SYNC, or TIMEOUT
501 <     * @param nanos timeout in nanosecs, used only if mode is TIMEOUT
500 >     * @param how NOW, ASYNC, SYNC, or TIMED
501 >     * @param nanos timeout in nanosecs, used only if mode is TIMED
502       * @return an item if matched, else e
503       * @throws NullPointerException if haveData mode but e is null
504       */
# 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 >= ASYNC) {               // 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 == TIMED), 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
596 <     * @param nanos timeout value
595 >     * @param timed if true, wait only until timeout elapses
596 >     * @param nanos timeout in nanosecs, used only if timed is true
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);
# Line 1042 | Line 1041 | public class LinkedTransferQueue<E> exte
1041       */
1042      public boolean tryTransfer(E e, long timeout, TimeUnit unit)
1043          throws InterruptedException {
1044 <        if (xfer(e, true, TIMEOUT, unit.toNanos(timeout)) == null)
1044 >        if (xfer(e, true, TIMED, unit.toNanos(timeout)) == null)
1045              return true;
1046          if (!Thread.interrupted())
1047              return false;
# Line 1058 | Line 1057 | public class LinkedTransferQueue<E> exte
1057      }
1058  
1059      public E poll(long timeout, TimeUnit unit) throws InterruptedException {
1060 <        E e = xfer(null, false, TIMEOUT, unit.toNanos(timeout));
1060 >        E e = xfer(null, false, TIMED, unit.toNanos(timeout));
1061          if (e != null || !Thread.interrupted())
1062              return e;
1063          throw new InterruptedException();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines