From 4796ad740415283bfbae4c6e7f72ab2fb5b67e06 Mon Sep 17 00:00:00 2001 From: boyce Date: Mon, 14 Dec 2020 16:05:32 +0800 Subject: [PATCH] =?UTF-8?q?TcpService=E6=96=B0=E5=A2=9E=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B1=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- network/processor/jsonprocessor.go | 5 ++++- network/processor/pbprocessor.go | 4 +++- network/processor/processor.go | 1 + network/slicepool.go | 18 +++++++++++------- network/tcp_conn.go | 4 ++-- network/tcp_msg.go | 10 ++++++---- network/tcp_server.go | 9 +++++++++ sysservice/tcpservice/tcpservice.go | 6 +++++- 8 files changed, 41 insertions(+), 16 deletions(-) diff --git a/network/processor/jsonprocessor.go b/network/processor/jsonprocessor.go index 1a5b7e8..33ea6c5 100644 --- a/network/processor/jsonprocessor.go +++ b/network/processor/jsonprocessor.go @@ -23,6 +23,7 @@ type JsonProcessor struct { unknownMessageHandler UnknownMessageJsonHandler connectHandler ConnectJsonHandler disconnectHandler ConnectJsonHandler + network.INetMempool } type JsonPackInfo struct { @@ -33,6 +34,8 @@ type JsonPackInfo struct { func NewJsonProcessor() *JsonProcessor { processor := &JsonProcessor{mapMsg:map[uint16]MessageJsonInfo{}} + processor.INetMempool = network.NewMemAreaPool() + return processor } @@ -54,7 +57,7 @@ func (jsonProcessor *JsonProcessor ) MsgRoute(msg interface{},userdata interface func (jsonProcessor *JsonProcessor) Unmarshal(data []byte) (interface{}, error) { typeStruct := struct {Type int `json:"typ"`}{} - defer network.ReleaseByteSlice(data) + defer jsonProcessor.ReleaseByteSlice(data) err := json.Unmarshal(data, &typeStruct) if err != nil { return nil, err diff --git a/network/processor/pbprocessor.go b/network/processor/pbprocessor.go index 0a55e91..0371564 100644 --- a/network/processor/pbprocessor.go +++ b/network/processor/pbprocessor.go @@ -25,6 +25,7 @@ type PBProcessor struct { unknownMessageHandler UnknownMessageHandler connectHandler ConnectHandler disconnectHandler ConnectHandler + network.INetMempool } type PBPackInfo struct { @@ -35,6 +36,7 @@ type PBPackInfo struct { func NewPBProcessor() *PBProcessor { processor := &PBProcessor{mapMsg:map[uint16]MessageInfo{}} + processor.INetMempool = network.NewMemAreaPool() return processor } @@ -64,7 +66,7 @@ func (pbProcessor *PBProcessor ) MsgRoute(msg interface{},userdata interface{}) // must goroutine safe func (pbProcessor *PBProcessor ) Unmarshal(data []byte) (interface{}, error) { - defer network.ReleaseByteSlice(data) + defer pbProcessor.ReleaseByteSlice(data) var msgType uint16 if pbProcessor.LittleEndian == true { msgType = binary.LittleEndian.Uint16(data[:2]) diff --git a/network/processor/processor.go b/network/processor/processor.go index e72ad14..8818a73 100644 --- a/network/processor/processor.go +++ b/network/processor/processor.go @@ -32,3 +32,4 @@ type IRawProcessor interface { SetConnectedHandler(connectHandler RawConnectHandler) SetDisConnectedHandler(disconnectHandler RawConnectHandler) } + diff --git a/network/slicepool.go b/network/slicepool.go index 7d4d663..b7aa2f3 100644 --- a/network/slicepool.go +++ b/network/slicepool.go @@ -4,6 +4,11 @@ import ( "sync" ) +type INetMempool interface { + MakeByteSlice(size int) []byte + ReleaseByteSlice(byteBuff []byte) bool +} + type memAreaPool struct { minAreaValue int //最小范围值 maxAreaValue int //最大范围值 @@ -20,6 +25,10 @@ func init(){ } } +func NewMemAreaPool() *memAreaPool{ + return &memAreaPool{} +} + func (areaPool *memAreaPool) makePool(){ poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue+1)/areaPool.growthValue areaPool.pool = make([]sync.Pool,poolLen) @@ -50,7 +59,6 @@ func (areaPool *memAreaPool) getPosByteSize(size int) int{ return pos } - func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool{ pos := areaPool.getPosByteSize(cap(byteBuff)) if pos > len(areaPool.pool) || pos == -1{ @@ -62,10 +70,9 @@ func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool{ return true } -func MakeByteSlice(size int) []byte{ +func (areaPool *memAreaPool) MakeByteSlice(size int) []byte{ for i:=0;i