diff --git a/.codacy.yml b/.codacy.yml new file mode 100644 index 0000000..5cb31fe --- /dev/null +++ b/.codacy.yml @@ -0,0 +1,2 @@ +exclude: + - "**/*.md" \ No newline at end of file diff --git a/server/client/client.go b/server/client/client.go index ecdcc68..1bfb16b 100644 --- a/server/client/client.go +++ b/server/client/client.go @@ -27,17 +27,28 @@ func CloneClient(client *Client) *Client { // Client 客户端 type Client struct { *events - core Core - mutex sync.Mutex - closed bool // 是否已关闭 - pool *concurrent.Pool[*Packet] // 数据包缓冲池 - loop *writeloop.Unbounded[*Packet] // 写入循环 - block chan struct{} // 以阻塞方式运行 + core Core + mutex sync.Mutex + closed bool // 是否已关闭 + pool *concurrent.Pool[*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) diff --git a/server/multiple.go b/server/multiple.go index 1670425..7e3bc83 100644 --- a/server/multiple.go +++ b/server/multiple.go @@ -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) diff --git a/server/server.go b/server/server.go index 94743ee..5a30509 100644 --- a/server/server.go +++ b/server/server.go @@ -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)) }) diff --git a/utils/reflects/func.go b/utils/reflects/func.go new file mode 100644 index 0000000..c30fc2d --- /dev/null +++ b/utils/reflects/func.go @@ -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) +}