mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
TcpService新增设置内存池接口
This commit is contained in:
@@ -23,6 +23,7 @@ type JsonProcessor struct {
|
|||||||
unknownMessageHandler UnknownMessageJsonHandler
|
unknownMessageHandler UnknownMessageJsonHandler
|
||||||
connectHandler ConnectJsonHandler
|
connectHandler ConnectJsonHandler
|
||||||
disconnectHandler ConnectJsonHandler
|
disconnectHandler ConnectJsonHandler
|
||||||
|
network.INetMempool
|
||||||
}
|
}
|
||||||
|
|
||||||
type JsonPackInfo struct {
|
type JsonPackInfo struct {
|
||||||
@@ -33,6 +34,8 @@ type JsonPackInfo struct {
|
|||||||
|
|
||||||
func NewJsonProcessor() *JsonProcessor {
|
func NewJsonProcessor() *JsonProcessor {
|
||||||
processor := &JsonProcessor{mapMsg:map[uint16]MessageJsonInfo{}}
|
processor := &JsonProcessor{mapMsg:map[uint16]MessageJsonInfo{}}
|
||||||
|
processor.INetMempool = network.NewMemAreaPool()
|
||||||
|
|
||||||
return processor
|
return processor
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +57,7 @@ func (jsonProcessor *JsonProcessor ) MsgRoute(msg interface{},userdata interface
|
|||||||
|
|
||||||
func (jsonProcessor *JsonProcessor) Unmarshal(data []byte) (interface{}, error) {
|
func (jsonProcessor *JsonProcessor) Unmarshal(data []byte) (interface{}, error) {
|
||||||
typeStruct := struct {Type int `json:"typ"`}{}
|
typeStruct := struct {Type int `json:"typ"`}{}
|
||||||
defer network.ReleaseByteSlice(data)
|
defer jsonProcessor.ReleaseByteSlice(data)
|
||||||
err := json.Unmarshal(data, &typeStruct)
|
err := json.Unmarshal(data, &typeStruct)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ type PBProcessor struct {
|
|||||||
unknownMessageHandler UnknownMessageHandler
|
unknownMessageHandler UnknownMessageHandler
|
||||||
connectHandler ConnectHandler
|
connectHandler ConnectHandler
|
||||||
disconnectHandler ConnectHandler
|
disconnectHandler ConnectHandler
|
||||||
|
network.INetMempool
|
||||||
}
|
}
|
||||||
|
|
||||||
type PBPackInfo struct {
|
type PBPackInfo struct {
|
||||||
@@ -35,6 +36,7 @@ type PBPackInfo struct {
|
|||||||
|
|
||||||
func NewPBProcessor() *PBProcessor {
|
func NewPBProcessor() *PBProcessor {
|
||||||
processor := &PBProcessor{mapMsg:map[uint16]MessageInfo{}}
|
processor := &PBProcessor{mapMsg:map[uint16]MessageInfo{}}
|
||||||
|
processor.INetMempool = network.NewMemAreaPool()
|
||||||
return processor
|
return processor
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +66,7 @@ func (pbProcessor *PBProcessor ) MsgRoute(msg interface{},userdata interface{})
|
|||||||
|
|
||||||
// must goroutine safe
|
// must goroutine safe
|
||||||
func (pbProcessor *PBProcessor ) Unmarshal(data []byte) (interface{}, error) {
|
func (pbProcessor *PBProcessor ) Unmarshal(data []byte) (interface{}, error) {
|
||||||
defer network.ReleaseByteSlice(data)
|
defer pbProcessor.ReleaseByteSlice(data)
|
||||||
var msgType uint16
|
var msgType uint16
|
||||||
if pbProcessor.LittleEndian == true {
|
if pbProcessor.LittleEndian == true {
|
||||||
msgType = binary.LittleEndian.Uint16(data[:2])
|
msgType = binary.LittleEndian.Uint16(data[:2])
|
||||||
|
|||||||
@@ -32,3 +32,4 @@ type IRawProcessor interface {
|
|||||||
SetConnectedHandler(connectHandler RawConnectHandler)
|
SetConnectedHandler(connectHandler RawConnectHandler)
|
||||||
SetDisConnectedHandler(disconnectHandler RawConnectHandler)
|
SetDisConnectedHandler(disconnectHandler RawConnectHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,11 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type INetMempool interface {
|
||||||
|
MakeByteSlice(size int) []byte
|
||||||
|
ReleaseByteSlice(byteBuff []byte) bool
|
||||||
|
}
|
||||||
|
|
||||||
type memAreaPool struct {
|
type memAreaPool struct {
|
||||||
minAreaValue int //最小范围值
|
minAreaValue int //最小范围值
|
||||||
maxAreaValue int //最大范围值
|
maxAreaValue int //最大范围值
|
||||||
@@ -20,6 +25,10 @@ func init(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewMemAreaPool() *memAreaPool{
|
||||||
|
return &memAreaPool{}
|
||||||
|
}
|
||||||
|
|
||||||
func (areaPool *memAreaPool) makePool(){
|
func (areaPool *memAreaPool) makePool(){
|
||||||
poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue+1)/areaPool.growthValue
|
poolLen := (areaPool.maxAreaValue - areaPool.minAreaValue+1)/areaPool.growthValue
|
||||||
areaPool.pool = make([]sync.Pool,poolLen)
|
areaPool.pool = make([]sync.Pool,poolLen)
|
||||||
@@ -50,7 +59,6 @@ func (areaPool *memAreaPool) getPosByteSize(size int) int{
|
|||||||
return pos
|
return pos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool{
|
func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool{
|
||||||
pos := areaPool.getPosByteSize(cap(byteBuff))
|
pos := areaPool.getPosByteSize(cap(byteBuff))
|
||||||
if pos > len(areaPool.pool) || pos == -1{
|
if pos > len(areaPool.pool) || pos == -1{
|
||||||
@@ -62,10 +70,9 @@ func (areaPool *memAreaPool) releaseByteSlice(byteBuff []byte) bool{
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func MakeByteSlice(size int) []byte{
|
func (areaPool *memAreaPool) MakeByteSlice(size int) []byte{
|
||||||
for i:=0;i<len(memAreaPoolList);i++{
|
for i:=0;i<len(memAreaPoolList);i++{
|
||||||
if size <= memAreaPoolList[i].maxAreaValue {
|
if size <= memAreaPoolList[i].maxAreaValue {
|
||||||
|
|
||||||
return memAreaPoolList[i].makeByteSlice(size)
|
return memAreaPoolList[i].makeByteSlice(size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,8 +80,7 @@ func MakeByteSlice(size int) []byte{
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (areaPool *memAreaPool) ReleaseByteSlice(byteBuff []byte) bool {
|
||||||
func ReleaseByteSlice(byteBuff []byte) bool {
|
|
||||||
for i:=0;i<len(memAreaPoolList);i++{
|
for i:=0;i<len(memAreaPoolList);i++{
|
||||||
if cap(byteBuff) <= memAreaPoolList[i].maxAreaValue {
|
if cap(byteBuff) <= memAreaPoolList[i].maxAreaValue {
|
||||||
return memAreaPoolList[i].releaseByteSlice(byteBuff)
|
return memAreaPoolList[i].releaseByteSlice(byteBuff)
|
||||||
@@ -83,5 +89,3 @@ func ReleaseByteSlice(byteBuff []byte) bool {
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func newTCPConn(conn net.Conn, pendingWriteNum int, msgParser *MsgParser) *TCPCo
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
_, err := conn.Write(b)
|
_, err := conn.Write(b)
|
||||||
ReleaseByteSlice(b)
|
tcpConn.msgParser.ReleaseByteSlice(b)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
@@ -126,7 +126,7 @@ func (tcpConn *TCPConn) ReadMsg() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (tcpConn *TCPConn) ReleaseReadMsg(byteBuff []byte){
|
func (tcpConn *TCPConn) ReleaseReadMsg(byteBuff []byte){
|
||||||
ReleaseByteSlice(byteBuff)
|
tcpConn.msgParser.ReleaseByteSlice(byteBuff)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tcpConn *TCPConn) WriteMsg(args ...[]byte) error {
|
func (tcpConn *TCPConn) WriteMsg(args ...[]byte) error {
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ type MsgParser struct {
|
|||||||
minMsgLen uint32
|
minMsgLen uint32
|
||||||
maxMsgLen uint32
|
maxMsgLen uint32
|
||||||
littleEndian bool
|
littleEndian bool
|
||||||
|
|
||||||
|
INetMempool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMsgParser() *MsgParser {
|
func NewMsgParser() *MsgParser {
|
||||||
@@ -23,7 +25,7 @@ func NewMsgParser() *MsgParser {
|
|||||||
p.minMsgLen = 1
|
p.minMsgLen = 1
|
||||||
p.maxMsgLen = 4096
|
p.maxMsgLen = 4096
|
||||||
p.littleEndian = false
|
p.littleEndian = false
|
||||||
|
p.INetMempool = NewMemAreaPool()
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,9 +101,9 @@ func (p *MsgParser) Read(conn *TCPConn) ([]byte, error) {
|
|||||||
|
|
||||||
// data
|
// data
|
||||||
//msgData := make([]byte, msgLen)
|
//msgData := make([]byte, msgLen)
|
||||||
msgData := MakeByteSlice(int(msgLen))
|
msgData := p.MakeByteSlice(int(msgLen))
|
||||||
if _, err := io.ReadFull(conn, msgData); err != nil {
|
if _, err := io.ReadFull(conn, msgData); err != nil {
|
||||||
ReleaseByteSlice(msgData)
|
p.ReleaseByteSlice(msgData)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +126,7 @@ func (p *MsgParser) Write(conn *TCPConn, args ...[]byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//msg := make([]byte, uint32(p.lenMsgLen)+msgLen)
|
//msg := make([]byte, uint32(p.lenMsgLen)+msgLen)
|
||||||
msg := MakeByteSlice(p.lenMsgLen+int(msgLen))
|
msg := p.MakeByteSlice(p.lenMsgLen+int(msgLen))
|
||||||
// write len
|
// write len
|
||||||
switch p.lenMsgLen {
|
switch p.lenMsgLen {
|
||||||
case 1:
|
case 1:
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ type TCPServer struct {
|
|||||||
MaxMsgLen uint32
|
MaxMsgLen uint32
|
||||||
LittleEndian bool
|
LittleEndian bool
|
||||||
msgParser *MsgParser
|
msgParser *MsgParser
|
||||||
|
netMemPool INetMempool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (server *TCPServer) Start() {
|
func (server *TCPServer) Start() {
|
||||||
@@ -54,11 +55,19 @@ func (server *TCPServer) init() {
|
|||||||
|
|
||||||
// msg parser
|
// msg parser
|
||||||
msgParser := NewMsgParser()
|
msgParser := NewMsgParser()
|
||||||
|
if msgParser.INetMempool == nil {
|
||||||
|
msgParser.INetMempool = NewMemAreaPool()
|
||||||
|
}
|
||||||
|
|
||||||
msgParser.SetMsgLen(server.LenMsgLen, server.MinMsgLen, server.MaxMsgLen)
|
msgParser.SetMsgLen(server.LenMsgLen, server.MinMsgLen, server.MaxMsgLen)
|
||||||
msgParser.SetByteOrder(server.LittleEndian)
|
msgParser.SetByteOrder(server.LittleEndian)
|
||||||
server.msgParser = msgParser
|
server.msgParser = msgParser
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (server *TCPServer) SetNetMempool(mempool INetMempool){
|
||||||
|
server.msgParser.INetMempool = mempool
|
||||||
|
}
|
||||||
|
|
||||||
func (server *TCPServer) run() {
|
func (server *TCPServer) run() {
|
||||||
server.wgLn.Add(1)
|
server.wgLn.Add(1)
|
||||||
defer server.wgLn.Done()
|
defer server.wgLn.Done()
|
||||||
|
|||||||
@@ -270,4 +270,8 @@ func (tcpService *TcpService) GetConnNum() int {
|
|||||||
connNum := len(tcpService.mapClient)
|
connNum := len(tcpService.mapClient)
|
||||||
tcpService.mapClientLocker.Unlock()
|
tcpService.mapClientLocker.Unlock()
|
||||||
return connNum
|
return connNum
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (server *TcpService) SetNetMempool(mempool network.INetMempool){
|
||||||
|
server.tcpServer.SetNetMempool(mempool)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user