Sfoglia il codice sorgente

Optimize with double-checked locking for better concurrency

Co-authored-by: RPRX <[email protected]>
copilot-swe-agent[bot] 5 mesi fa
parent
commit
52f7f3d174
1 ha cambiato i file con 17 aggiunte e 9 eliminazioni
  1. 17 9
      proxy/wireguard/server.go

+ 17 - 9
proxy/wireguard/server.go

@@ -83,18 +83,26 @@ func (*Server) Network() []net.Network {
 
 // Process implements proxy.Inbound.
 func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, dispatcher routing.Dispatcher) error {
-	// Use RWMutex to safely handle concurrent access to routing info
+	// Use double-checked locking to safely handle concurrent access to routing info
 	// Only update if not set or if dispatcher is different
-	s.infoMutex.Lock()
-	if s.info.dispatcher == nil || s.info.dispatcher != dispatcher {
-		s.info = routingInfo{
-			ctx:        ctx,
-			dispatcher: dispatcher,
-			inboundTag: session.InboundFromContext(ctx),
-			contentTag: session.ContentFromContext(ctx),
+	// First check without write lock for better concurrency
+	s.infoMutex.RLock()
+	needsUpdate := s.info.dispatcher == nil || s.info.dispatcher != dispatcher
+	s.infoMutex.RUnlock()
+	
+	if needsUpdate {
+		s.infoMutex.Lock()
+		// Double-check after acquiring write lock
+		if s.info.dispatcher == nil || s.info.dispatcher != dispatcher {
+			s.info = routingInfo{
+				ctx:        ctx,
+				dispatcher: dispatcher,
+				inboundTag: session.InboundFromContext(ctx),
+				contentTag: session.ContentFromContext(ctx),
+			}
 		}
+		s.infoMutex.Unlock()
 	}
-	s.infoMutex.Unlock()
 
 	ep, err := s.bindServer.ParseEndpoint(conn.RemoteAddr().String())
 	if err != nil {