/** Unblock given source. */
  void unblock(MembershipKeyImpl key, InetAddress source) {
    assert key.channel() == this;
    assert key.sourceAddress() == null;

    synchronized (stateLock) {
      if (!key.isValid()) throw new IllegalStateException("key is no longer valid");

      try {
        if (key instanceof MembershipKeyImpl.Type6) {
          MembershipKeyImpl.Type6 key6 = (MembershipKeyImpl.Type6) key;
          Net.unblock6(fd, key6.groupAddress(), key6.index(), Net.inet6AsByteArray(source));
        } else {
          MembershipKeyImpl.Type4 key4 = (MembershipKeyImpl.Type4) key;
          Net.unblock4(fd, key4.groupAddress(), key4.interfaceAddress(), Net.inet4AsInt(source));
        }
      } catch (IOException ioe) {
        // should not happen
        throw new AssertionError(ioe);
      }
    }
  }