You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.8 KiB
75 lines
1.8 KiB
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]) |
|
}
|
|
|