docs: public boolean unblock()
      {
          final AtomicBuffer buffer = this.buffer;
          final long headPosition = buffer.getLongVolatile(headPositionIndex);
          final long tailPosition = buffer.getLongVolatile(tailPositionIndex);
  
          if (headPosition == tailPosition)
          {
              return false;
          }
  
          final int mask = capacity - 1;
          final int consumerIndex = (int)(headPosition & mask);
          final int producerIndex = (int)(tailPosition & mask);
  
          boolean unblocked = false;
          int length = buffer.getIntVolatile(consumerIndex);
          if (length < 0)
          {
              buffer.putInt(typeOffset(consumerIndex), PADDING_MSG_TYPE_ID);
              buffer.putIntOrdered(lengthOffset(consumerIndex), -length);
              unblocked = true;
          }
          else if (0 == length)
          {
              // go from (consumerIndex to producerIndex) or (consumerIndex to capacity)
              final int limit = producerIndex > consumerIndex ? producerIndex : capacity;
              int i = consumerIndex + ALIGNMENT;
  
              do
              {
                  // read the top int of every long (looking for length aligned to 8=ALIGNMENT)
                  length = buffer.getIntVolatile(i);
                  if (0 != length)
                  {
                      if (scanBackToConfirmStillZeroed(buffer, i, consumerIndex))
                      {
                          buffer.putInt(typeOffset(consumerIndex), PADDING_MSG_TYPE_ID);
                          buffer.putIntOrdered(lengthOffset(consumerIndex), i - consumerIndex);
                          unblocked = true;
                      }
  
                      break;
                  }
  
                  i += ALIGNMENT;
              }
              while (i < limit);
          }
  
          return unblocked;
      }