예제 #1
0
  /**
   * Destroy the socket manager, freeing all the associated resources. This method will block until
   * all the managed sockets are closed.
   *
   * <p>CANNOT be restarted.
   */
  public void destroySocketManager() {
    if (!_isDestroyed.compareAndSet(false, true)) {
      // shouldn't happen, log a stack trace to find out why it happened
      _log.logCloseLoop("I2PSocketManager", getName());
      return;
    }
    _connectionManager.setAllowIncomingConnections(false);
    _connectionManager.shutdown();
    if (!_subsessions.isEmpty()) {
      for (I2PSession sess : _subsessions) {
        removeSubsession(sess);
      }
    }

    // should we destroy the _session too?
    // yes, since the old lib did (and SAM wants it to, and i dont know why not)
    if ((_session != null) && (!_session.isClosed())) {
      try {
        _session.destroySession();
      } catch (I2PSessionException ise) {
        _log.warn("Unable to destroy the session", ise);
      }
      PcapWriter pcap = null;
      synchronized (_pcapInitLock) {
        pcap = pcapWriter;
      }
      if (pcap != null) pcap.flush();
    }
  }
예제 #2
0
 /** @since 0.9.21 */
 private void verifySession(I2PSession session) throws I2PException {
   if (_isDestroyed.get()) throw new I2PException("Session was closed");
   if (!session.isClosed()) return;
   session.connect();
 }