Merge branch 'develop'
This commit is contained in:
commit
f8d8d37216
|
@ -0,0 +1,2 @@
|
||||||
|
exclude:
|
||||||
|
- "**/*.md"
|
|
@ -31,13 +31,24 @@ type Client struct {
|
||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
closed bool // 是否已关闭
|
closed bool // 是否已关闭
|
||||||
pool *concurrent.Pool[*Packet] // 数据包缓冲池
|
pool *concurrent.Pool[*Packet] // 数据包缓冲池
|
||||||
loop *writeloop.Unbounded[*Packet] // 写入循环
|
loop *writeloop.Channel[*Packet] // 写入循环
|
||||||
|
loopBufferSize int // 写入循环缓冲区大小
|
||||||
block chan struct{} // 以阻塞方式运行
|
block chan struct{} // 以阻塞方式运行
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run 运行客户端,当客户端已运行时,会先关闭客户端再重新运行
|
// Run 运行客户端,当客户端已运行时,会先关闭客户端再重新运行
|
||||||
// - block 以阻塞方式运行
|
// - block 以阻塞方式运行
|
||||||
func (slf *Client) Run(block ...bool) error {
|
func (slf *Client) Run(block ...bool) error {
|
||||||
|
return slf.RunByBufferSize(1024*10, block...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunByBufferSize 指定写入循环缓冲区大小运行客户端,当客户端已运行时,会先关闭客户端再重新运行
|
||||||
|
// - block 以阻塞方式运行
|
||||||
|
func (slf *Client) RunByBufferSize(size int, block ...bool) error {
|
||||||
|
if size <= 0 {
|
||||||
|
return errors.New("buffer size must be greater than 0")
|
||||||
|
}
|
||||||
|
slf.loopBufferSize = size
|
||||||
slf.mutex.Lock()
|
slf.mutex.Lock()
|
||||||
if !slf.closed {
|
if !slf.closed {
|
||||||
slf.mutex.Unlock()
|
slf.mutex.Unlock()
|
||||||
|
@ -69,7 +80,7 @@ func (slf *Client) Run(block ...bool) error {
|
||||||
data.data = nil
|
data.data = nil
|
||||||
data.callback = nil
|
data.callback = nil
|
||||||
})
|
})
|
||||||
slf.loop = writeloop.NewUnbounded[*Packet](slf.pool, func(message *Packet) error {
|
slf.loop = writeloop.NewChannel[*Packet](slf.pool, slf.loopBufferSize, func(message *Packet) error {
|
||||||
err := slf.core.Write(message)
|
err := slf.core.Write(message)
|
||||||
if message.callback != nil {
|
if message.callback != nil {
|
||||||
message.callback(err)
|
message.callback(err)
|
||||||
|
|
|
@ -69,7 +69,7 @@ func (slf *MultipleServer) Run() {
|
||||||
kcp.SystemTimedSched.Close()
|
kcp.SystemTimedSched.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowServersInfo(serverMultipleMark, slf.servers...)
|
showServersInfo(serverMultipleMark, slf.servers...)
|
||||||
|
|
||||||
systemSignal := make(chan os.Signal, 1)
|
systemSignal := make(chan os.Signal, 1)
|
||||||
signal.Notify(systemSignal, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
|
signal.Notify(systemSignal, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
|
||||||
|
|
|
@ -129,7 +129,7 @@ func (srv *Server) Run(addr string) (err error) {
|
||||||
onServicesInit(srv)
|
onServicesInit(srv)
|
||||||
onMessageSystemInit(srv)
|
onMessageSystemInit(srv)
|
||||||
if srv.multiple == nil {
|
if srv.multiple == nil {
|
||||||
ShowServersInfo(serverMark, srv)
|
showServersInfo(serverMark, srv)
|
||||||
}
|
}
|
||||||
if err = <-startState; err != nil {
|
if err = <-startState; err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -780,11 +780,12 @@ func (srv *Server) HasMessageStatistics() bool {
|
||||||
return srv.runtime.messageStatisticsLock != nil
|
return srv.runtime.messageStatisticsLock != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShowServersInfo 显示服务器信息
|
// showServersInfo 显示服务器信息
|
||||||
func ShowServersInfo(mark string, servers ...*Server) {
|
func showServersInfo(mark string, servers ...*Server) {
|
||||||
var serverInfos = make([]func(), 0, len(servers))
|
var serverInfos = make([]func(), 0, len(servers))
|
||||||
var ip, _ = network.IP()
|
var ip, _ = network.IP()
|
||||||
for _, srv := range servers {
|
for _, srv := range servers {
|
||||||
|
srv := srv
|
||||||
serverInfos = append(serverInfos, func() {
|
serverInfos = append(serverInfos, func() {
|
||||||
log.Info("Server", log.String(mark, "RunningInfo"), log.Any("network", srv.network), log.String("ip", ip.String()), log.String("listen", srv.addr))
|
log.Info("Server", log.String(mark, "RunningInfo"), log.Any("network", srv.network), log.String("ip", ip.String()), log.String("listen", srv.addr))
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
package reflects
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WrapperFunc 包装函数
|
||||||
|
func WrapperFunc[Func any](f any, wrapper func(call func([]reflect.Value) []reflect.Value) func(args []reflect.Value) []reflect.Value) (wf Func, err error) {
|
||||||
|
tof := reflect.TypeOf(f)
|
||||||
|
if tof.Kind() != reflect.Func {
|
||||||
|
return wf, fmt.Errorf("f is not a function, got %v", tof.String())
|
||||||
|
}
|
||||||
|
return reflect.MakeFunc(tof, wrapper(func(args []reflect.Value) []reflect.Value {
|
||||||
|
return reflect.ValueOf(f).Call(args)
|
||||||
|
})).Interface().(Func), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapperFuncBefore2After 包装函数,前置函数执行前,后置函数执行后
|
||||||
|
func WrapperFuncBefore2After[Func any](f Func, before, after func()) (wf Func, err error) {
|
||||||
|
vof := reflect.ValueOf(f)
|
||||||
|
tof := vof.Type()
|
||||||
|
if tof.Kind() != reflect.Func {
|
||||||
|
return wf, fmt.Errorf("f is not a function, got %v", tof.String())
|
||||||
|
}
|
||||||
|
wrapped := reflect.MakeFunc(tof, func(args []reflect.Value) []reflect.Value {
|
||||||
|
if before != nil {
|
||||||
|
before()
|
||||||
|
}
|
||||||
|
result := vof.Call(args)
|
||||||
|
if after != nil {
|
||||||
|
after()
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
|
||||||
|
return wrapped.Interface().(Func), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapperFuncBefore 包装函数,前置函数执行前
|
||||||
|
func WrapperFuncBefore[Func any](f Func, before func()) (wf Func, err error) {
|
||||||
|
return WrapperFuncBefore2After(f, before, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WrapperFuncAfter 包装函数,后置函数执行后
|
||||||
|
func WrapperFuncAfter[Func any](f Func, after func()) (wf Func, err error) {
|
||||||
|
return WrapperFuncBefore2After(f, nil, after)
|
||||||
|
}
|
Loading…
Reference in New Issue