Ver Fonte

p2p: use safe atomic operations when changing connFlags (#17325)

Felföldi Zsolt há 7 anos atrás
pai
commit
eef65b20fc
1 ficheiros alterados com 11 adições e 6 exclusões
  1. 11 6
      p2p/server.go

+ 11 - 6
p2p/server.go

@@ -258,13 +258,18 @@ func (c *conn) is(f connFlag) bool {
 }
 
 func (c *conn) set(f connFlag, val bool) {
-	flags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))
-	if val {
-		flags |= f
-	} else {
-		flags &= ^f
+	for {
+		oldFlags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))
+		flags := oldFlags
+		if val {
+			flags |= f
+		} else {
+			flags &= ^f
+		}
+		if atomic.CompareAndSwapInt32((*int32)(&c.flags), int32(oldFlags), int32(flags)) {
+			return
+		}
 	}
-	atomic.StoreInt32((*int32)(&c.flags), int32(flags))
 }
 
 // Peers returns all connected peers.