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