76 lines
1.8 KiB
Go
76 lines
1.8 KiB
Go
package server
|
|
|
|
import (
|
|
"go-common/app/interface/main/broadcast/conf"
|
|
"go-common/app/service/main/broadcast/libs/bytes"
|
|
"go-common/app/service/main/broadcast/libs/time"
|
|
)
|
|
|
|
// RoundOptions .
|
|
type RoundOptions struct {
|
|
Timer int
|
|
TimerSize int
|
|
Reader int
|
|
ReadBuf int
|
|
ReadBufSize int
|
|
Writer int
|
|
WriteBuf int
|
|
WriteBufSize int
|
|
}
|
|
|
|
// Round userd for connection round-robin get a reader/writer/timer for split big lock.
|
|
type Round struct {
|
|
readers []bytes.Pool
|
|
writers []bytes.Pool
|
|
timers []time.Timer
|
|
options RoundOptions
|
|
}
|
|
|
|
// NewRound new a round struct.
|
|
func NewRound(c *conf.Config) (r *Round) {
|
|
var i int
|
|
r = new(Round)
|
|
options := RoundOptions{
|
|
Reader: c.TCP.Reader,
|
|
ReadBuf: c.TCP.ReadBuf,
|
|
ReadBufSize: c.TCP.ReadBufSize,
|
|
Writer: c.TCP.Writer,
|
|
WriteBuf: c.TCP.WriteBuf,
|
|
WriteBufSize: c.TCP.WriteBufSize,
|
|
Timer: c.Timer.Timer,
|
|
TimerSize: c.Timer.TimerSize,
|
|
}
|
|
r.options = options
|
|
// reader
|
|
r.readers = make([]bytes.Pool, options.Reader)
|
|
for i = 0; i < options.Reader; i++ {
|
|
r.readers[i].Init(options.ReadBuf, options.ReadBufSize)
|
|
}
|
|
// writer
|
|
r.writers = make([]bytes.Pool, options.Writer)
|
|
for i = 0; i < options.Writer; i++ {
|
|
r.writers[i].Init(options.WriteBuf, options.WriteBufSize)
|
|
}
|
|
// timer
|
|
r.timers = make([]time.Timer, options.Timer)
|
|
for i = 0; i < options.Timer; i++ {
|
|
r.timers[i].Init(options.TimerSize)
|
|
}
|
|
return
|
|
}
|
|
|
|
// Timer get a timer.
|
|
func (r *Round) Timer(rn int) *time.Timer {
|
|
return &(r.timers[rn%r.options.Timer])
|
|
}
|
|
|
|
// Reader get a reader memory buffer.
|
|
func (r *Round) Reader(rn int) *bytes.Pool {
|
|
return &(r.readers[rn%r.options.Reader])
|
|
}
|
|
|
|
// Writer get a writer memory buffer pool.
|
|
func (r *Round) Writer(rn int) *bytes.Pool {
|
|
return &(r.writers[rn%r.options.Writer])
|
|
}
|