docs: public boolean  add(long seqno, T element, boolean block) {
          validate(seqno);
  
          if(seqno <= hd)                 // seqno already delivered, includes check seqno <= low
              return false;
  
          if(seqno - low > capacity() && (!block || !block(seqno)))  // seqno too big
              return false;
  
          // now we can set any slow > hd and yet not overwriting low (check #1 above)
          int index=index(seqno);
  
          // Fix for correctness check #1 (see doc/design/RingBuffer.txt)
          if(buf.get(index) != null || seqno <= hd)
              return false;
  
          if(!buf.compareAndSet(index, null, element)) // the element at buf[index] was already present
              return false;
  
          // now see if hr needs to moved forward, this can be concurrent as we may have multiple producers
          for(;;) {
              long current_hr=hr.get();
              long new_hr=Math.max(seqno, current_hr);
              if(new_hr <= current_hr || hr.compareAndSet(current_hr, new_hr))
                  break;
          }
  
          return true;
      }