code: @Override
      public int drainTo(Collection<? super T> c, int maxElements) {
  
          //TODO- The elements aren't added to the given collection...
  
          if (c == null)
              throw new NullPointerException();
          if (c == this)
              throw new IllegalArgumentException();
  
          int n = Math.min(maxElements, size());
  
          int numRemaining = n;
  
          synchronized (this) {
              synchronized (lock) {
                  //Retrieve and remove at most n elements from the expedited buffer and add them to the passed collection
                  for (int i = 0; i < n; i++) {
                      T retrieved = expeditedExtract();
                      numRemaining = n - i;
                      if (retrieved != null) {
                          numberOfUsedExpeditedSlots.getAndDecrement();
                          //TODO if expedited is added for put or offer with timeout add notification here
                      } else {
                          break; //retrieved is null so nothing left in the expedited buffer, move on to the main buffer
                      }
                  }
                  //Retrieve and remove at most numRemaining elements and add them to the passed collection
                  for (int i = 0; i < numRemaining; i++) {
                      T retrieved = extract();
                      numberOfUsedSlots.getAndDecrement();
                      if (retrieved != null) {
                          notifyPut_();
                      }
                  }
              }
          }
          return n;
      }
docs: /*
  @awisniew - ADDED
  
  (non-Javadoc)
  
  @see java.util.concurrent.BlockingQueue#drainTo(java.util.Collection, int)