From 741e2f0e3b6dd7c1036e23071e6e32cd490db801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=81=93=E7=95=91?= Date: Thu, 12 Sep 2019 15:32:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=A8=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E4=B8=AD=E4=BD=BF=E7=94=A8defer=E9=87=8A=E6=94=BE=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go/gateway.go | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/go/gateway.go b/go/gateway.go index f5addce..ee9c3b8 100755 --- a/go/gateway.go +++ b/go/gateway.go @@ -268,21 +268,28 @@ func (g *Gateway) acceptVirtualConn(pair [2]*link.Session, session *link.Session for i := 0; i < 2; i++ { state := pair[i].State.(*gwState) - state.Lock() - defer state.Unlock() - if state.disposed { - return false - } + checkOk := func () bool { + state.Lock() + defer state.Unlock() + if state.disposed { + return false + } - if pair[i] == session && maxConn != 0 && len(state.virtualConns) >= maxConn { - return false - } + if pair[i] == session && maxConn != 0 && len(state.virtualConns) >= maxConn { + return false + } - if _, exists := state.virtualConns[connID]; exists { - panic("Virtual Connection Already Exists") - } + if _, exists := state.virtualConns[connID]; exists { + panic("Virtual Connection Already Exists") + } - state.virtualConns[connID] = struct{}{} + state.virtualConns[connID] = struct{}{} + + return true + } + if !checkOk() { + return false + } } g.addVirtualConn(connID, pair) @@ -306,12 +313,14 @@ func (g *Gateway) closeVirtualConn(connID uint32) { for i := 0; i < 2; i++ { state := pair[i].State.(*gwState) - state.Lock() - defer state.Unlock() - if state.disposed { - continue - } - delete(state.virtualConns, connID) - g.send(pair[i], g.encodeCloseCmd(connID)) + func() { + state.Lock() + defer state.Unlock() + if state.disposed { + return + } + delete(state.virtualConns, connID) + g.send(pair[i], g.encodeCloseCmd(connID)) + }() } }