Merge pull request #509 from iamqizhao/master

Tune the server accepting code
diff --git a/server.go b/server.go
index be4d4e6..dd86427 100644
--- a/server.go
+++ b/server.go
@@ -262,18 +262,26 @@
 			c.Close()
 			return nil
 		}
-		st, err := transport.NewServerTransport("http2", c, s.opts.maxConcurrentStreams, authInfo)
-		if err != nil {
-			s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err)
-			s.mu.Unlock()
-			c.Close()
-			grpclog.Println("grpc: Server.Serve failed to create ServerTransport: ", err)
-			continue
-		}
-		s.conns[st] = true
 		s.mu.Unlock()
 
 		go func() {
+			st, err := transport.NewServerTransport("http2", c, s.opts.maxConcurrentStreams, authInfo)
+			if err != nil {
+				s.mu.Lock()
+				s.errorf("NewServerTransport(%q) failed: %v", c.RemoteAddr(), err)
+				s.mu.Unlock()
+				c.Close()
+				grpclog.Println("grpc: Server.Serve failed to create ServerTransport: ", err)
+				return
+			}
+			defer st.Close()
+			s.mu.Lock()
+			if s.conns == nil {
+				s.mu.Unlock()
+				return
+			}
+			s.conns[st] = true
+			s.mu.Unlock()
 			var wg sync.WaitGroup
 			st.HandleStreams(func(stream *transport.Stream) {
 				var trInfo *traceInfo