From fc639da8d408be5dbff96c008ec3936ef683f565 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期一, 03 八月 2020 18:13:27 +0800 Subject: [PATCH] add Free --- library.go | 55 ++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 36 insertions(+), 19 deletions(-) diff --git a/library.go b/library.go index 491d63d..e489b13 100644 --- a/library.go +++ b/library.go @@ -42,6 +42,7 @@ */ type Handle struct { ctx context.Context + wg *sync.WaitGroup // 鍒涘缓channel瀵瑰簲鐨剅eply,绛夊緟璇诲彇鍏朵腑鐨勫唴瀹�,server // 鍏朵腑蹇呴』鏈変竴涓綔涓篟equest鍑芥暟鐨剆erver m map[string]*sockServer @@ -65,24 +66,11 @@ chReply chan TransInfo } -func garbageCollect(ctx context.Context, h *Handle) { - - <-ctx.Done() - - for _, v := range h.m { - v.sock.Close() - } - h.sockHB.sock.Close() - h.sockPub.sock.Close() - h.sockSub.sock.Close() - h.sockRep.sock.Close() - h.sockWorker.sock.Close() -} - -func recvRoutine(ctx context.Context, sock *DgramSocket, ch chan<- TransInfo) { +func recvRoutine(ctx context.Context, sock *DgramSocket, wg *sync.WaitGroup, ch chan<- TransInfo) { for { select { case <-ctx.Done(): + wg.Done() return default: if data, peer, err := sock.RecvFromTimeout(0, 10*1000); err == nil { @@ -150,6 +138,8 @@ } } + wg := &sync.WaitGroup{} + chSize := 5 chSub := make(chan TransInfo, chSize) chReply := make(chan TransInfo, chSize) @@ -158,7 +148,9 @@ sockReply := OpenDgramSocket() sockReply.Bind(int(regReply.ReplyKey)) // 鍚姩鎺ユ敹绾跨▼ - go recvRoutine(ctx, sockReply, chSub) + + wg.Add(1) + go recvRoutine(ctx, sockReply, wg, chSub) repS := &sockServer{ sock: sockReply, info: info.ProcInfo, @@ -184,7 +176,8 @@ sockSub.Sub(v, int(regReply.SubTopicKey)) } // 鍚姩鎺ユ敹绾跨▼ - go recvRoutine(ctx, sockSub, chSub) + wg.Add(1) + go recvRoutine(ctx, sockSub, wg, chSub) subC := &sockClient{ sock: sockSub, peer: -1, @@ -198,6 +191,7 @@ } handle := &Handle{ ctx: ctx, + wg: wg, m: m, sockHB: hbC, sockPub: pubC, @@ -208,9 +202,28 @@ chReply: chReply, } - go garbageCollect(ctx, handle) - return handle +} + +// Free free +func (h *Handle) Free() { + h.wg.Wait() + + for _, v := range h.m { + v.sock.Close() + } + h.sockHB.sock.Close() + h.sockHB = nil + h.sockPub.sock.Close() + h.sockPub = nil + h.sockSub.sock.Close() + h.sockSub = nil + h.sockRep.sock.Close() + h.sockRep = nil + h.sockWorker.sock.Close() + h.sockWorker = nil + + fmt.Println("Handle Safe Free") } const ( @@ -323,6 +336,10 @@ // GetMesg get mesg for sub or reply func (h *Handle) GetMesg() (subMsg *MsgInfo, replyMsg *MsgInfo, replyKey int) { + if h.sockHB == nil && h.sockRep == nil && h.sockPub == nil && h.sockSub == nil && h.sockWorker == nil { + return nil, nil, -1 + } + if len(h.chSub) > 1 { m := <-h.chSub subMsg = m.info -- Gitblit v1.8.0