code: func (c *channelPool) Put(conn IOSession) error {
  	if conn == nil {
  		return errors.New("connection is nil. rejecting")
  	}
  
  	c.Lock()
  
  	if c.conns == nil {
  		c.Unlock()
  		// pool is closed, close passed connection
  		return conn.Close()
  	}
  
  	// put the resource back into the pool. If the pool is full, this will
  	// block and the default case will be executed.
  	select {
  	case c.conns <- conn:
  		c.Unlock()
  		return nil
  	default:
  		// pool is full, close passed connection
  		c.Unlock()
  		return conn.Close()
  	}
  }
docs: // Put implements the Pool interfaces Put() method. If the pool is full or closed,
  // conn is simply closed. A nil conn will be rejected.