syncthing/vendor/github.com/xtaci/kcp-go/emitter.go

51 lines
808 B
Go
Raw Normal View History

2017-03-07 13:28:09 +00:00
package kcp
import (
"net"
"sync/atomic"
)
var defaultEmitter Emitter
func init() {
defaultEmitter.init()
}
type (
// packet emit request
2017-03-07 13:28:09 +00:00
emitPacket struct {
conn net.PacketConn
to net.Addr
data []byte
// mark this packet should recycle to global xmitBuf
2017-03-07 13:28:09 +00:00
recycle bool
}
// Emitter is the global packet sender
Emitter struct {
ch chan emitPacket
}
)
func (e *Emitter) init() {
e.ch = make(chan emitPacket)
2017-03-07 13:28:09 +00:00
go e.emitTask()
}
// keepon writing packets to kernel
func (e *Emitter) emitTask() {
for p := range e.ch {
if n, err := p.conn.WriteTo(p.data, p.to); err == nil {
atomic.AddUint64(&DefaultSnmp.OutPkts, 1)
2017-03-07 13:28:09 +00:00
atomic.AddUint64(&DefaultSnmp.OutBytes, uint64(n))
}
if p.recycle {
xmitBuf.Put(p.data)
}
}
}
func (e *Emitter) emit(p emitPacket) {
e.ch <- p
}