code: func (c *MConnection) sendRoutine() {
  	defer c._recover()
  
  FOR_LOOP:
  	for {
  		var n int
  		var err error
  		select {
  		case <-c.flushTimer.Ch:
  			// NOTE: flushTimer.Set() must be called every time
  			// something is written to .bufWriter.
  			c.flush()
  		case <-c.chStatsTimer.Ch:
  			for _, channel := range c.channels {
  				channel.updateStats()
  			}
  		case <-c.pingTimer.Ch:
  			log.Debug("Send Ping")
  			wire.WriteByte(packetTypePing, c.bufWriter, &n, &err)
  			c.sendMonitor.Update(int(n))
  			c.flush()
  		case <-c.pong:
  			log.Debug("Send Pong")
  			wire.WriteByte(packetTypePong, c.bufWriter, &n, &err)
  			c.sendMonitor.Update(int(n))
  			c.flush()
  		case <-c.quit:
  			break FOR_LOOP
  		case <-c.send:
  			// Send some msgPackets
  			eof := c.sendSomeMsgPackets()
  			if !eof {
  				// Keep sendRoutine awake.
  				select {
  				case c.send <- struct{}{}:
  				default:
  				}
  			}
  		}
  
  		if !c.IsRunning() {
  			break FOR_LOOP
  		}
  		if err != nil {
  			log.Warn("Connection failed @ sendRoutine", "conn", c, "error", err)
  			c.stopForError(err)
  			break FOR_LOOP
  		}
  	}
  
  	// Cleanup
  }
docs: // sendRoutine polls for packets to send from channels.