code: protected void addSocket(final S newSocket) {
  		if(isClosed()) throw new IllegalStateException("SocketContext is closed");
  		Future<?> future;
  		synchronized(sockets) {
  			Identifier id = newSocket.getId();
  			if(sockets.containsKey(id)) throw new IllegalStateException("Socket with the same ID has already been added");
  			sockets.put(id, newSocket);
  			future = listenerManager.enqueueEvent(
  				new ConcurrentListenerManager.Event<SocketContextListener>() {
  					@Override
  					public Runnable createCall(final SocketContextListener listener) {
  						return new Runnable() {
  							@Override
  							public void run() {
  								listener.onNewSocket(AbstractSocketContext.this, newSocket);
  							}
  						};
  					}
  				}
  			);
  		}
  		try {
  			future.get();
  		} catch(ExecutionException e) {
  			logger.log(Level.SEVERE, null, e);
  		} catch(InterruptedException e) {
  			logger.log(Level.SEVERE, null, e);
  			// Restore the interrupted status
  			Thread.currentThread().interrupt();
  		}
  	}
docs: Adds a new socket to this context, sockets must be added to the context
  before they create any of their own events.  This gives context listeners
  a chance to register per-socket listeners in "onNewSocket".
  
  First, adds to the list of sockets.
  Second, calls all listeners notifying them of new socket.
  Third, waits for all listeners to handle the event before returning.