code: public boolean add(long seqno, T element, boolean block) {
          lock.lock();
          try {
              if(seqno <= hd)                 // seqno already delivered, includes check seqno <= low
                  return false;
  
              if(seqno - low > capacity() && (!block || !block(seqno)))  // seqno too big
                  return false;
  
              int index=index(seqno);
  
              if(buf[index] != null)
                  return false;
              else
                  buf[index]=element;
  
              // now see if hr needs to moved forward, this can be concurrent as we may have multiple producers
              if(seqno > hr)
                  hr=seqno;
              return true;
          }
          finally {
              lock.unlock();
          }
      }
docs: Adds a new element to the buffer
  @param seqno The seqno of the element
  @param element The element
  @param block If true, add() will block when the buffer is full until there is space. Else, add() will
  return immediately, either successfully or unsuccessfully (if the buffer is full)
  @return True if the element was added, false otherwise.