code: public void put(Object x) throws InterruptedException {
          if (x == null) {
              throw new IllegalArgumentException();
          }
  
          // D186845 if (Thread.interrupted())
          // D186845 throw new InterruptedException();
  
          // D312598 - begin
          boolean ret = false;
          while (true) {
              synchronized (lock) {
                  if (numberOfUsedSlots.get() < buffer.length) {
                      insert(x);
                      numberOfUsedSlots.getAndIncrement();
                      ret = true;
                  }
              }
  
              if (ret) {
                  notifyGet_();
                  return;
              }
  
              int spinctr = SPINS_PUT_;
              while (numberOfUsedSlots.get() >= buffer.length) {
                  // busy wait
                  if (spinctr > 0) {
                      if (YIELD_PUT_)
                          Thread.yield();
                      spinctr--;
                  } else {
                      // block on lock
                      waitPut_(WAIT_SHORT_SLICE_);
                  }
              }
          }
          // D312598 - end
  
      }
docs: Puts an object into the buffer. If the buffer is full,
  the call will block indefinitely until space is freed up.
  
  @param x
  the object being placed in the buffer.
  @exception IllegalArgumentException
  if the object is null.