Merge branch 'develop'

This commit is contained in:
kercylan98 2023-12-27 16:42:56 +08:00
commit f8d8d37216
5 changed files with 73 additions and 11 deletions

2
.codacy.yml Normal file
View File

@ -0,0 +1,2 @@
exclude:
- "**/*.md"

View File

@ -31,13 +31,24 @@ type Client struct {
mutex sync.Mutex
closed bool // 是否已关闭
pool *concurrent.Pool[*Packet] // 数据包缓冲池
loop *writeloop.Unbounded[*Packet] // 写入循环
loop *writeloop.Channel[*Packet] // 写入循环
loopBufferSize int // 写入循环缓冲区大小
block chan struct{} // 以阻塞方式运行
}
// Run 运行客户端,当客户端已运行时,会先关闭客户端再重新运行
// - block 以阻塞方式运行
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()
if !slf.closed {
slf.mutex.Unlock()
@ -69,7 +80,7 @@ func (slf *Client) Run(block ...bool) error {
data.data = 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)
if message.callback != nil {
message.callback(err)

View File

@ -69,7 +69,7 @@ func (slf *MultipleServer) Run() {
kcp.SystemTimedSched.Close()
}
ShowServersInfo(serverMultipleMark, slf.servers...)
showServersInfo(serverMultipleMark, slf.servers...)
systemSignal := make(chan os.Signal, 1)
signal.Notify(systemSignal, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)

View File

@ -129,7 +129,7 @@ func (srv *Server) Run(addr string) (err error) {
onServicesInit(srv)
onMessageSystemInit(srv)
if srv.multiple == nil {
ShowServersInfo(serverMark, srv)
showServersInfo(serverMark, srv)
}
if err = <-startState; err != nil {
return err
@ -780,11 +780,12 @@ func (srv *Server) HasMessageStatistics() bool {
return srv.runtime.messageStatisticsLock != nil
}
// ShowServersInfo 显示服务器信息
func ShowServersInfo(mark string, servers ...*Server) {
// showServersInfo 显示服务器信息
func showServersInfo(mark string, servers ...*Server) {
var serverInfos = make([]func(), 0, len(servers))
var ip, _ = network.IP()
for _, srv := range servers {
srv := srv
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))
})

48
utils/reflects/func.go Normal file
View File

@ -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)
}