From 26aa2d9ff8c064105f4e8f44bad5da9046d76718 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 26 Dec 2023 17:23:28 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=20ShowServersInfo?= =?UTF-8?q?=20=E5=87=BD=E6=95=B0=E5=8F=AF=E8=A7=81=E6=80=A7=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9C=8D=E5=8A=A1=E5=99=A8=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E7=9A=84=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/multiple.go | 2 +- server/server.go | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) 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)) }) From bdbcc1bb358deacbc2250a46b22ad758c7067f9b Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 27 Dec 2023 10:04:45 +0800 Subject: [PATCH 2/4] =?UTF-8?q?perf:=20client=20=E5=8C=85=E7=94=B1?= =?UTF-8?q?=E6=97=A0=E7=95=8C=E7=BC=93=E5=86=B2=E5=8C=BA=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=B8=BA=E5=9F=BA=E4=BA=8E=20chan=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=9A=84=E7=BC=93=E5=86=B2=E5=8C=BA=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20RunByBufferSize=20=E5=87=BD=E6=95=B0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BB=A5=E6=8C=87=E5=AE=9A=E7=BC=93=E5=86=B2=E5=8C=BA=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/client/client.go | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) 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) From 5a898f58dc37027b3ba1b5deac6f573bb8d3c52f Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 27 Dec 2023 10:57:57 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20reflects=20=E5=8C=85=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20FuncWrapper=20=E7=9B=B8=E5=85=B3=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/reflects/func.go | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 utils/reflects/func.go 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) +} From 256d62d499d50238566170beecd798e78a21904a Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 27 Dec 2023 16:41:59 +0800 Subject: [PATCH 4/4] =?UTF-8?q?other:=20=E6=8E=92=E9=99=A4=20codacy=20?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=20md=20=E6=96=87=E4=BB=B6=EF=BC=8C(#43)=20(#?= =?UTF-8?q?44)=20(#45)=20(#46)=20(#47)=20(#48)=20(#49)=20(#50)=20(#51)=20(?= =?UTF-8?q?#52)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .codacy.yml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .codacy.yml 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