connection.go
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
}
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
}
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 ( " " ) wire . WriteByte ( packetTypePing , c . bufWriter , & n , & err ) c . sendMonitor . Update ( int ( n ) ) c . flush ( ) case <- c . pong : log . Debug ( " " ) 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 ( " " , " " , c , " " , err ) c . stopForError ( err ) break FOR_LOOP } } // Cleanup }
// sendRoutine polls for packets to send from channels.
sendRoutine polls for packets to send from channels .