vRp.CD2g_test/server/dispatcher.go

70 lines
1.3 KiB
Go

package server
import (
"github.com/alphadose/haxmap"
)
var dispatcherUnique = struct{}{}
// generateDispatcher 生成消息分发器
func generateDispatcher(size int, name string, handler func(dispatcher *dispatcher, message *Message)) *dispatcher {
return &dispatcher{
name: name,
buffer: make(chan *Message, size),
handler: handler,
uniques: haxmap.New[string, struct{}](),
}
}
// dispatcher 消息分发器
type dispatcher struct {
name string
buffer chan *Message
uniques *haxmap.Map[string, struct{}]
handler func(dispatcher *dispatcher, message *Message)
}
func (slf *dispatcher) unique(name string) bool {
_, loaded := slf.uniques.GetOrSet(name, dispatcherUnique)
return loaded
}
func (slf *dispatcher) antiUnique(name string) {
slf.uniques.Del(name)
}
func (slf *dispatcher) start() {
for {
select {
case message, ok := <-slf.buffer:
if !ok {
return
}
slf.handler(slf, message)
}
}
}
func (slf *dispatcher) put(message *Message) {
slf.buffer <- message
}
func (slf *dispatcher) close() {
close(slf.buffer)
}
func (slf *dispatcher) transfer(target *dispatcher) {
if target == nil {
return
}
for {
select {
case message, ok := <-slf.buffer:
if !ok {
return
}
target.buffer <- message
}
}
}