public final void cancel() {
    mLock.readLock().lock();

    try {
      if (mClosed) {
        return;
      }
    } finally {
      mLock.readLock().unlock();
    }

    mLock.writeLock().lock();

    try {
      mClosed = true;
    } finally {
      mLock.writeLock().unlock();
    }

    try {
      mSocket.close();
    } catch (IOException e) {
    }
  }